home *** CD-ROM | disk | FTP | other *** search
/ PC World 2006 December / PCWorld_2006-12_cd.bin / v cisle / robocopy / rktools.exe / RCDATA / CABINET / rktools.msi / clone.vbs < prev    next >
Text File  |  2003-04-18  |  80KB  |  3,095 lines

  1. '----------------------------------------------------------------------
  2. '
  3. ' Copyright (c) Microsoft Corporation 1998-2003
  4. ' All Rights Reserved
  5. '
  6. ' Abstract:
  7. '
  8. '    clone.vbs - printer server cloning script for Windows .NET Server 2003
  9. '
  10. ' Usage:
  11. '
  12. '    clone [-dopfa?] [-c server-name]
  13. '
  14. ' Examples:
  15. '    clone -d
  16. '    clone -o -c \\server
  17. '    clone -p -c \\server
  18. '    clone -f
  19. '    clone -a
  20. '
  21. '----------------------------------------------------------------------
  22.  
  23. option explicit
  24.  
  25. '
  26. ' Messages to be displayed if the scripting host is not cscript
  27. '
  28. const kMessage1 = "Please run this script using CScript."
  29. const kMessage2 = "This can be achieved by"
  30. const kMessage3 = "1. Using ""CScript script.vbs arguments"" or"
  31. const kMessage4 = "2. Changing the default Windows Scripting Host to CScript"
  32. const kMessage5 = "   using ""CScript //H:CScript //S"" and running the script "
  33. const kMessage6 = "   ""script.vbs arguments""."
  34.  
  35. '
  36. ' Default script names
  37. '
  38. const kDriverScript   =   "drv_clone.vbs"
  39. const kPortScript     =   "port_clone.vbs"
  40. const kPrinterScript  =   "prn_clone.vbs"
  41. const kFormScript     =   "form_clone.vbs"
  42.  
  43. '
  44. ' The shell script for installing all components
  45. '
  46. const kInstallScript  =   "install.bat"
  47.  
  48. '
  49. ' Strings identifying environments
  50. '
  51. const kEnvironmentIntel   = "Windows NT x86"
  52. const kEnvironmentMIPS    = "Windows NT R4000"
  53. const kEnvironmentAlpha   = "Windows NT Alpha_AXP"
  54. const kEnvironmentPowerPC = "Windows NT PowerPC"
  55. const kEnvironmentWindows = "Windows 4.0"
  56. const kEnvironmentUnknown = "unknown"
  57.  
  58. '
  59. ' Strings identifying architectures
  60. '
  61. const kArchIntel          = "Intel"
  62. const kArchMIPS           = "MIPS"
  63. const kArchAlpha          = "Alpha"
  64. const kArchPowerPC        = "PowerPC"
  65. const kArchUnknown        = "Unknown"
  66.  
  67. '
  68. ' Strings identifying driver versions
  69. ' Change these strings on localized builds
  70. '
  71. const kVersionWindows95   = "Windows 95 or 98"
  72. const kVersion_NT31       = "Windows NT 3.1"
  73. const kVersion35x         = "Windows NT 3.5 or 3.51"
  74. const kVersion351         = "Windows NT 3.51"
  75. const kVersion40          = "Windows NT 4.0"
  76. const kVersion4050        = "Windows NT 4.0 or 2000"
  77. const kVersion50          = "Windows 2000"
  78.  
  79. '
  80. ' Action codes
  81. '
  82. const kActionUnknown  = 0
  83. const kActionDrivers  = 1
  84. const kActionPorts    = 2
  85. const kActionPrinters = 3
  86. const kActionForms    = 4
  87. const kActionAll      = 5
  88.  
  89. '
  90. ' Port types
  91. '
  92. const kTcpRaw   = 1
  93. const kTcpLpr   = 2
  94. const kLocal    = 3
  95. const kLprMon   = 5
  96. const kHPdlc    = 7
  97. const kUnknown  = 8
  98.  
  99. const kStdTCPIP = "Standard TCP/IP Port"
  100.  
  101. '
  102. ' Printer attribute masks
  103. '
  104. const kPrinterNetwork = 16
  105. const kPrinterLocal   = 64
  106.  
  107. '
  108. '  Search patterns used in the regular expressions
  109. '  to skip COMx: and LPTx: ports
  110. '
  111. const kComPortPattern = "^COM\d+:$"
  112. const kLptPortPattern = "^LPT\d+:$"
  113.  
  114. '
  115. ' Persist constant
  116. '
  117. const kAllSettings    = 127
  118.  
  119. '
  120. ' Other string constants
  121. '
  122. const kTrueStr   =  "true"
  123. const kFalseStr  =  "false"
  124. const kLongLineStr  =    _
  125.   "'--------------------------------------------------------------------------"
  126.  
  127. '
  128. ' Source server that will be cloned
  129. '
  130. dim strServerName
  131. dim strPrefixServerName
  132.  
  133. '
  134. ' For writing the script file
  135. '
  136. dim oFileSystem
  137. dim oScript
  138.  
  139. '
  140. ' Script name string
  141. '
  142. dim strScriptName
  143. dim iAction
  144.  
  145. main
  146.  
  147. '
  148. ' Main execution starts here
  149. '
  150. sub main
  151.  
  152.    '
  153.    ' Abort if the host is not cscript
  154.    '
  155.    if not IsHostCscript() then
  156.  
  157.        call wscript.echo(kMessage1 & vbCRLF & kMessage2 & vbCRLF & _
  158.                          kMessage3 & vbCRLF & kMessage4 & vbCRLF & _
  159.                          kMessage5 & vbCRLF & kMessage6 & vbCRLF)
  160.  
  161.        wscript.quit
  162.  
  163.    end if
  164.  
  165.    ParseCommandLine
  166.  
  167.    '
  168.    ' Check if a machine name was passed
  169.    '
  170.    if (strServerName <> "") then
  171.  
  172.        strPrefixServerName = strServerName
  173.  
  174.    else
  175.  
  176.        strPrefixServerName =  strGetLocalMachineName()
  177.  
  178.    end if
  179.  
  180.    '
  181.    ' Remove the "\\" in front of the machine name
  182.    '
  183.    strPrefixServerName = strGetNameStringOnly(strPrefixServerName) & "_"
  184.  
  185.    set oFileSystem = CreateObject ("Scripting.FileSystemObject")
  186.  
  187.    '
  188.    ' According to the different action codes, create the corresponding script
  189.    '
  190.    if iAction = kActionDrivers or iAction = kActionAll then
  191.  
  192.        strScriptName  = strPrefixServerName & kDriverScript
  193.        DriverCloneScript strScriptName, strServerName
  194.  
  195.    end if
  196.  
  197.    if iAction = kActionPorts or iAction = kActionAll then
  198.  
  199.        strScriptName  = strPrefixServerName & kPortScript
  200.        PortCloneScript strScriptName, strServerName
  201.  
  202.    end if
  203.  
  204.    if iAction = kActionPrinters or iAction = kActionAll then
  205.  
  206.        strScriptName  = strPrefixServerName & kPrinterScript
  207.        PrinterCloneScript strScriptName, strServerName
  208.  
  209.    end if
  210.  
  211.    if iAction = kActionForms or iAction = kActionAll then
  212.  
  213.        strScriptName  = strPrefixServerName & kFormScript
  214.        FormCloneScript strScriptName, strServerName
  215.  
  216.    end if
  217.  
  218.    '
  219.    '  Generate the script for launching all the cloning scripts
  220.    '
  221.    strScriptName = strPrefixServerName & kInstallScript
  222.    InstallScript strScriptName, strPrefixServerName
  223.  
  224. end sub
  225.  
  226. '
  227. '------------------------------------------------------------------------
  228. '      Driver cloning script
  229. '------------------------------------------------------------------------
  230. '
  231. sub DriverCloneScript(ByVal strScriptName, ByVal strServerName)
  232.  
  233.     on error resume next
  234.  
  235.     wscript.echo
  236.     wscript.echo "Creating the driver cloning script..."
  237.  
  238.     '
  239.     ' Open the script file
  240.     '
  241.     set oScript = oFileSystem.CreateTextFile(strScriptName,TRUE)
  242.  
  243.     '
  244.     ' Write the header of the driver cloning script
  245.     '
  246.     DriverStartUp
  247.  
  248.     ws("    EchoLine kNormal, """" ")
  249.     ws("    EchoLine kNormal, ""------------------------------"" ")
  250.     ws("    EchoLine kNormal, ""Start installing drivers..."" ")
  251.  
  252.     '
  253.     ' Enumerate all the drivers in server "strServerName", for each driver
  254.     ' found, add a line in the script to call the AddDriver subroutine
  255.     '
  256.     dim oMaster
  257.     dim oDriver
  258.     dim iDriverCount
  259.  
  260.     iDriverCount = 0
  261.     set oMaster  = CreateObject("PrintMaster.PrintMaster.1")
  262.     for each oDriver in oMaster.Drivers(strServerName)
  263.  
  264.         if Err = 0 then
  265.  
  266.             '
  267.             ' Add a call to "AddDriver" function in the script
  268.             '
  269.             iDriverCount = iDriverCount + 1
  270.             ws("    AddDriver   strDestServer, _")
  271.             ws("                """ & oDriver.ModelName     & """,  _")
  272.             ws("                """ & GetVersion(oDriver.Version, oDriver.Environment) & """,  _")
  273.  
  274.             '
  275.             ' Change Path to be default, i.e. ""
  276.             '
  277.             ws("                """",  _")
  278.             ws("                """ & GetArchitecture(oDriver.Environment) & """,  _")
  279.  
  280.             '
  281.             ' Change InfFile to be default, i.e. ""
  282.             '
  283.             ws("                """" ")
  284.  
  285.         else
  286.  
  287.             '
  288.             ' Clean up
  289.             '
  290.             oScript.Close
  291.  
  292.             oFileSystem.DeleteFile strScriptName
  293.  
  294.             wscript.echo "Error: Listing ports, error: 0x" & Hex(Err.Number)
  295.             if Err.Description <> "" then
  296.                 wscript.echo "Error description: " & Err.Description
  297.             end if
  298.  
  299.             exit sub
  300.  
  301.         end if
  302.  
  303.     next
  304.  
  305.     wscript.echo "Success: Listing drivers on server " & strServerName
  306.  
  307.     '
  308.     '  Write the summary script
  309.     '
  310.     wscript.echo "A total of " & CStr(iDriverCount) & " drivers are listed."
  311.  
  312.     ws("    EchoLine kNormal, ""Attempted to install a total of "" & CStr(iDriverCount) & "" driver(s)."" ")
  313.     ws("    EchoLine kNormal, CStr(iSuccessCount) & "" driver(s) were successfully installed."" ")
  314.  
  315.     '
  316.     '  Append other functions to the driver cloning script
  317.     '
  318.     DriverCleanUp
  319.  
  320.     '
  321.     ' Close the script file
  322.     '
  323.     oScript.Close
  324.  
  325.     wscript.echo "The script file for cloning drivers is """ & strScriptName & """."
  326.  
  327. end sub
  328.  
  329. '
  330. ' Writing the script for "AddDriver" function
  331. '
  332. sub ScriptAddDriver
  333.  
  334.     '
  335.     ' Insert the comment line before the function header
  336.     '
  337.     blank
  338.     ws("'")
  339.     ws("' Add a driver")
  340.     ws("'")
  341.  
  342.     '
  343.     ' The function header
  344.     '
  345.     ws("sub AddDriver(ByVal strServerName,         _")
  346.     ws("              ByVal strModelName,          _")
  347.     ws("              ByVal strDriverVersion,      _")
  348.     ws("              ByVal strPath,               _")
  349.     ws("              ByVal strDriverArchitecture, _")
  350.     ws("              ByVal strInfFile             _")
  351.     ws(")")
  352.     blank
  353.  
  354.     '
  355.     ' The function body
  356.     '
  357.     ws("    on error resume next")
  358.     blank
  359.  
  360.     '
  361.     ' Print out the information about the driver that is about to be installed
  362.     '
  363.     ws("    iDriverCount = iDriverCount + 1")
  364.     ws("    EchoLine kVerbose, ""Driver:"" & CSTR(iDriverCount) ")
  365.     ws("    EchoLine kVerbose, ""    ServerName         : "" & strServerName ")
  366.     ws("    EchoLine kVerbose, ""    ModelName          : "" & strModelName ")
  367.     ws("    EchoLine kVerbose, ""    DriverVersion      : "" & strDriverVersion ")
  368.     ws("    EchoLine kVerbose, ""    DriverArchitecture : "" & strDriverArchitecture ")
  369.     blank
  370.  
  371.     '
  372.     ' The code that installs the driver
  373.     '
  374.     ws("    dim oMaster")
  375.     ws("    dim oDriver")
  376.     blank
  377.  
  378.     ws("    set oMaster = CreateObject(""PrintMaster.PrintMaster.1"")")
  379.     ws("    set oDriver = CreateObject(""Driver.Driver.1"")")
  380.     blank
  381.  
  382.     ws("    oDriver.ServerName         = strServerName")
  383.     ws("    oDriver.ModelName          = strModelName")
  384.     ws("    oDriver.DriverVersion      = strDriverVersion")
  385.     ws("    oDriver.Path               = strPath")
  386.     ws("    oDriver.DriverArchitecture = strDriverArchitecture")
  387.     ws("    oDriver.InfFile            = strInfFile")
  388.     blank
  389.  
  390.     ws("    oMaster.DriverAdd oDriver")
  391.     blank
  392.  
  393.     ws("    if Err = 0 then")
  394.     blank
  395.  
  396.     ws("        EchoLine kVerbose, ""Success: Driver "" & strModelName & "" added to server "" & strServerName ")
  397.     ws("        iSuccessCount = iSuccessCount + 1")
  398.     blank
  399.  
  400.     ws("    else")
  401.     blank
  402.  
  403.     ws("        EchoLine kNormal, ""Error adding driver "" & strModelName & "", error: 0x"" & Hex(Err.Number)")
  404.     ws("        if Err.Description <> """" then ")
  405.     ws("            EchoLine kNormal,  ""       Error description: "" & Err.Description ")
  406.     ws("        end if")
  407.     ws("        Err.Clear")
  408.     blank
  409.  
  410.  
  411.     ws("    end if")
  412.     blank
  413.  
  414.     ws("    EchoLine kVerbose, """"")
  415.     blank
  416.  
  417.     ws("end sub")
  418.     blank
  419.  
  420. end sub
  421.  
  422. '
  423. ' StartUp script for cloning drivers
  424. '
  425. sub DriverStartUp
  426.  
  427.     '
  428.     ' Start creating the driver cloning script
  429.     '
  430.     CopyrightScript
  431.     DriverAbstractScript
  432.  
  433.     '
  434.     ' The script program starts
  435.     '
  436.     blank
  437.     ws("option explicit")
  438.     blank
  439.  
  440.     ws("'")
  441.     ws("' Verbose Level")
  442.     ws("'")
  443.     ws("const kNormal    = 0")
  444.     ws("const kVerbose   = 1")
  445.     blank
  446.  
  447.     ws("'")
  448.     ws("' Flag, set if the user doesn't want to replace the old forms")
  449.     ws("'")
  450.     ws("dim bKeepOriginalOnes")
  451.     blank
  452.  
  453.     ws("dim strDestServer")
  454.     blank
  455.  
  456.     ws("' The number of drivers to be installed")
  457.     blank
  458.     ws("dim iDriverCount")
  459.     blank
  460.     ws("' The number of drivers successfully installed")
  461.     blank
  462.     ws("dim iSuccessCount")
  463.     blank
  464.     ws("dim bVerbose")
  465.     blank
  466.  
  467.     ws("main")
  468.     blank
  469.     ws("'")
  470.     ws("' Main execution starts here")
  471.     ws("'")
  472.  
  473.     ws("sub main")
  474.     blank
  475.     ws("    bVerbose = false")
  476.     ws("    bKeepOriginalOnes = false")
  477.     ws("    iDriverCount  = 0")
  478.     ws("    iSuccessCount = 0")
  479.     ws("    strDestServer = """"")
  480.     ws("    ParseCommandLine")
  481.     blank
  482.  
  483. end sub
  484.  
  485. '
  486. ' CleanUp script for cloning drivers
  487. '
  488. sub DriverCleanUp
  489.  
  490.     ws("end sub")
  491.  
  492.     '
  493.     ' Append the subroutine "AddDriver"
  494.     '
  495.     ScriptAddDriver
  496.  
  497.     '
  498.     ' Append the command line parsing script
  499.     '
  500.     ParseCommandLineScript
  501.  
  502.     '
  503.     ' Append the Usage script
  504.     '
  505.     DriverUsageScript
  506.  
  507.     '
  508.     ' Append the output macro
  509.     '
  510.     EchoLineScript
  511.  
  512. end sub
  513.  
  514. '
  515. ' Abstract for the driver cloning script
  516. '
  517. sub DriverAbstractScript
  518.  
  519.     ws("' Abstract:")
  520.     ws("'")
  521.     ws("' " & strScriptName & " - driver cloning script for Windows 2000")
  522.     ws("'")
  523.     oScript.WriteLine(kLongLineStr)
  524.  
  525. end sub
  526.  
  527. '
  528. ' The Usage script used in the driver cloning script
  529. '
  530. sub DriverUsageScript
  531.  
  532.     blank
  533.     ws("'")
  534.     ws("' Display command usage.")
  535.     ws("'")
  536.     ws("sub Usage(ByVal bExit)")
  537.     blank
  538.  
  539.     ws("    EchoLine kNormal, ""Usage: " & strScriptName & " [-c Destination_Server] [-v]"" ")
  540.     ws("    EchoLine kNormal, ""Arguments:"" ")
  541.     ws("    EchoLine kNormal, ""    -c   - destination server name"" ")
  542.     ws("    EchoLine kNormal, ""    -v   - verbose mode"" ")
  543.     ws("    EchoLine kNormal, ""    -?   - display command usage"" ")
  544.     ws("    EchoLine kNormal, """" ")
  545.     ws("    EchoLine kNormal, ""Examples:"" ")
  546.     ws("    EchoLine kNormal, ""    " & strScriptName & """ ")
  547.     blank
  548.  
  549.     ws("    if bExit then")
  550.     ws("        wscript.quit(1)")
  551.     ws("    end if")
  552.     blank
  553.  
  554.     ws("end sub")
  555.     blank
  556.  
  557. end sub
  558.  
  559. '
  560. '------------------------------------------------------------------------
  561. '      Port cloning script
  562. '------------------------------------------------------------------------
  563. '
  564. sub PortCloneScript(ByVal strScriptName, ByVal strServerName)
  565.  
  566.     on error resume next
  567.  
  568.     wscript.echo
  569.     wscript.echo "Creating the port cloning script..."
  570.  
  571.     '
  572.     ' Open the script file
  573.     '
  574.     set oScript = oFileSystem.CreateTextFile(strScriptName,TRUE)
  575.  
  576.     PortStartUp
  577.  
  578.     ws("    EchoLine kNormal, """" ")
  579.     ws("    EchoLine kNormal, ""------------------------------"" ")
  580.     ws("    EchoLine kNormal, ""Start installing ports..."" ")
  581.  
  582.     '
  583.     ' Enumerate all the ports in server "strServerName", for each port found,
  584.     ' add a line in the script to call the AddLocalPort subroutine
  585.     '
  586.     dim oMaster
  587.     dim oPort
  588.     dim iPortCount
  589.  
  590.     iPortCount = 0
  591.     set oMaster  = CreateObject("PrintMaster.PrintMaster.1")
  592.     for each oPort in oMaster.Ports(strServerName)
  593.  
  594.         if Err = 0 then
  595.  
  596.            if oPort.PortType = kLprMon or oPort.PortType = kHPdlc then
  597.  
  598.                '
  599.                ' Skip these ports because PrnAdmin cannot add them
  600.                '
  601.                wscript.echo "Skipping port " & oPort.PortName & " (" & Description(oPort.PortType) & ")"
  602.  
  603.            else
  604.                '
  605.                '  Duplicate only local ports different from LPTx:, COMx:
  606.                '
  607.                if oPort.PortType         =  kLocal                           and _
  608.                   bFindPortPattern(kComPortPattern, oPort.PortName) = false  and _
  609.                   bFindPortPattern(kLptPortPattern, oPort.PortName) = false  then
  610.  
  611.                    '
  612.                    ' First try deleting the existing port
  613.                    '
  614.                    ws("    DeletePort      strDestServer, _")
  615.                    ws("                    """ & StuffQuote(oPort.PortName) & """")
  616.  
  617.                    '
  618.                    ' Add the local port
  619.                    '
  620.                    iPortCount = iPortCount + 1
  621.                    ws("    AddLocalPort    strDestServer, _")
  622.                    ws("                    """ & StuffQuote(oPort.PortName)  & """")
  623.                    blank
  624.  
  625.                else
  626.  
  627.                    '
  628.                    ' Otherwise, clone Standard TCP/IP ports
  629.                    '
  630.                    if oPort.PortType = kTcpRaw      or _
  631.                       oPort.PortType = kTcpLpr      or _
  632.                       oPort.Description = kStdTCPIP then
  633.  
  634.                        '
  635.                        ' Get the configuration of this TCP port
  636.                        '
  637.                        dim strPortNameBackup
  638.  
  639.                        strPortNameBackup = oPort.PortName
  640.  
  641.                        oMaster.PortGet strServerName, strPortNameBackup , oPort
  642.  
  643.                        if Err = 0 then
  644.  
  645.                            '
  646.                            ' First try deleting the existing port
  647.                            '
  648.                            ws("    DeletePort      strDestServer, _")
  649.                            ws("                    """ & StuffQuote(oPort.PortName) & """")
  650.  
  651.                            '
  652.                            ' Add this standard TCP/IP port
  653.                            '
  654.                            iPortCount = iPortCount + 1
  655.  
  656.                            if oPort.PortType = kTcpRaw then
  657.  
  658.                                '
  659.                                ' Add a call to "AddTCPRawPort"
  660.                                '
  661.                                ws("    AddTCPRawPort   strDestServer, _")
  662.                                ws("                    """ & StuffQuote(oPort.PortName)      & """,  _")
  663.                                ws("                    """ & oPort.HostAddress               & """,  _")
  664.                                ws("                    "   & CStr(oPort.PortNumber)          & ",  _")
  665.                                ws("                    "   & BoolStr(oPort.SNMP)             & ",  _")
  666.                                ws("                    "   & CStr(oPort.SNMPDeviceIndex)     & ",  _")
  667.                                ws("                    """ & oPort.CommunityName             & """")
  668.                                blank
  669.  
  670.                            else
  671.  
  672.                                '
  673.                                ' Add a call to "AddTCPLprPort"
  674.                                '
  675.                                ws("    AddTCPLprPort   strDestServer, _")
  676.                                ws("                    """ & StuffQuote(oPort.PortName)      & """,  _")
  677.                                ws("                    """ & oPort.HostAddress               & """,  _")
  678.                                ws("                    "   & CStr(oPort.PortNumber)          & ",    _")
  679.                                ws("                    """ & oPort.QueueName                 & """,  _")
  680.                                ws("                    "   & BoolStr(oPort.SNMP)             & ",  _")
  681.                                ws("                    "   & CStr(oPort.SNMPDeviceIndex)     & ",  _")
  682.                                ws("                    """ & oPort.CommunityName             & """,  _")
  683.                                ws("                    "   & BoolStr(oPort.DoubleSpool)      & "")
  684.                                blank
  685.  
  686.                             end if
  687.  
  688.                         else
  689.  
  690.                             wscript.echo "Error getting configuration for port " & oPort.PortName & " (Standard TCP Port)"
  691.  
  692.                             Err.Clear
  693.  
  694.                         end if
  695.  
  696.                    else
  697.  
  698.                        wscript.echo "Skipping port " & oPort.PortName & " (" & Description(oPort.PortType) & ")"
  699.  
  700.                    end if
  701.  
  702.                end if
  703.  
  704.            end if
  705.  
  706.         else
  707.  
  708.             '
  709.             ' Clean up
  710.             '
  711.             oScript.Close
  712.  
  713.             oFileSystem.DeleteFile strScriptName
  714.  
  715.             wscript.echo "Error: Listing ports, error: 0x" & Hex(Err.Number)
  716.             if Err.Description <> "" then
  717.                 wscript.echo "Error description: " & Err.Description
  718.             end if
  719.  
  720.             exit sub
  721.  
  722.         end if
  723.  
  724.     next
  725.  
  726.     if Err = 0 then
  727.  
  728.         wscript.echo "Success: Listing ports on Server " & strServerName
  729.  
  730.     else
  731.  
  732.         wscript.echo "Error: Listing ports, error: 0x" & Hex(Err.Number)
  733.         if Err.Description <> "" then
  734.             wscript.echo "Error description: " & Err.Description
  735.         end if
  736.  
  737.         Err.Clear
  738.  
  739.     end if
  740.  
  741.     '
  742.     ' Write the summary script
  743.     '
  744.     wscript.echo "A total of " & CStr(iPortCount) & " port(s) are listed."
  745.  
  746.     ws("    EchoLine kNormal, ""Attempted to install a total of "" & CStr(iPortCount) & "" port(s)."" ")
  747.     ws("    EchoLine kNormal, CStr(iSuccessCount) & "" port(s) successfully installed,"" ")
  748.     ws("    EchoLine kNormal, CStr(iExistCount) & "" port(s) already exist."" ")
  749.  
  750.     '
  751.     ' Append other functions of port cloning script
  752.     '
  753.     PortCleanUp
  754.  
  755.     '
  756.     ' Close the script file
  757.     '
  758.     oScript.Close
  759.  
  760.     wscript.echo "The script file for cloning ports is """ & strScriptName & """."
  761.  
  762. end sub
  763.  
  764. '
  765. ' Subroutine of "AddLocalPort"
  766. '
  767. sub ScriptAddLocalPort
  768.  
  769.     '
  770.     ' Insert the comment line before the function header
  771.     '
  772.     blank
  773.     ws("'")
  774.     ws("' Add a local port")
  775.     ws("'")
  776.  
  777.     '
  778.     ' The function header
  779.     '
  780.     ws("sub AddLocalPort(ByVal strServerName,         _")
  781.     ws("                 ByVal strPortName            _")
  782.     ws(")")
  783.     blank
  784.  
  785.     '
  786.     ' The function body
  787.     '
  788.     ws("    on error resume next")
  789.     blank
  790.  
  791.     '
  792.     ' Print out the information about the port that is about to be installed
  793.     '
  794.     ws("    iPortCount = iPortCount + 1")
  795.     ws("    EchoLine kVerbose, ""Port:"" & CStr(iPortCount) ")
  796.     ws("    EchoLine kVerbose, ""    ServerName         : "" & strServerName ")
  797.     ws("    EchoLine kVerbose, ""    PortName           : "" & strPortName ")
  798.     ws("    EchoLine kVerbose, ""    PortType           : "  & Description(kLocal) & """")
  799.     blank
  800.  
  801.     ws("    dim oMaster")
  802.     ws("    dim oPort")
  803.     blank
  804.  
  805.     ws("    set oMaster = CreateObject(""PrintMaster.PrintMaster.1"")")
  806.     ws("    set oPort   = CreateObject(""Port.Port.1"")")
  807.     blank
  808.  
  809.     ws("    oPort.ServerName         = strServerName")
  810.     ws("    oPort.PortName           = strPortName")
  811.     ws("    oPort.PortType           = kLocal" )
  812.     blank
  813.  
  814.     ws("    oMaster.PortAdd oPort")
  815.     blank
  816.  
  817.     ws("    if Err = 0 or Err.Number = &H800700B7 then")
  818.     blank
  819.  
  820.     ws("        if Err = 0 then")
  821.     ws("            EchoLine kVerbose, ""Success: Port "" & strPortName & "" (" & Description(kTcpRaw) & ") added to server "" & strServerName ")
  822.     ws("            iSuccessCount = iSuccessCount + 1")
  823.     ws("        else")
  824.     ws("            EchoLine kVerbose, ""Port "" & strPortName & "" (" & Description(kTcpRaw) & ") already exists on server "" & strServerName ")
  825.     ws("            iExistCount = iExistCount + 1")
  826.     ws("        end if")
  827.     blank
  828.  
  829.     ws("    else")
  830.     blank
  831.  
  832.     ws("        EchoLine kNormal, ""Error: adding port "" & strPortName & "" (" & Description(kLocal) & "), error: 0x"" & Hex(Err.Number) ")
  833.     ws("        if Err.Description <> """" then ")
  834.     ws("            EchoLine kNormal,  ""       Error description: "" & Err.Description ")
  835.     ws("        end if")
  836.     ws("        Err.Clear")
  837.     blank
  838.  
  839.  
  840.     ws("    end if")
  841.     blank
  842.  
  843.     ws("    EchoLine kVerbose, """"")
  844.     blank
  845.  
  846.     ws("end sub")
  847.     blank
  848.  
  849. end sub
  850.  
  851. '
  852. ' Subroutine of "AddTCPRawPort"
  853. '
  854. sub ScriptAddTCPRawPort
  855.  
  856.     '
  857.     ' Insert the comment line before the function header
  858.     '
  859.     blank
  860.     ws("'")
  861.     ws("' Add a Tcp raw port")
  862.     ws("'")
  863.  
  864.     '
  865.     ' The function header
  866.     '
  867.     ws("sub AddTCPRawPort(ByVal strServerName,         _")
  868.     ws("                  ByVal strPortName,           _")
  869.     ws("                  ByVal strHostAddress,        _")
  870.     ws("                  ByVal PortNumber,            _")
  871.     ws("                  ByVal SNMP,                  _")
  872.     ws("                  ByVal SNMPDeviceIndex,       _")
  873.     ws("                  ByVal CommunityName          _")
  874.     ws(")")
  875.     blank
  876.  
  877.     '
  878.     ' The function body
  879.     '
  880.     ws("    on error resume next")
  881.     blank
  882.  
  883.     '
  884.     ' Print out the information about the port that is about to be installed
  885.     '
  886.     ws("    iPortCount = iPortCount + 1")
  887.     ws("    EchoLine kVerbose, ""Port:"" & CStr(iPortCount) ")
  888.     ws("    EchoLine kVerbose, ""    ServerName         : "" & strServerName ")
  889.     ws("    EchoLine kVerbose, ""    PortName           : "" & strPortName ")
  890.     ws("    EchoLine kVerbose, ""    PortType           : "  & Description(kTcpRaw) & """")
  891.     ws("    EchoLine kVerbose, ""    HostAddress        : "" & strHostAddress ")
  892.     ws("    EchoLine kVerbose, ""    PortNumber         : "" & CStr(PortNumber) ")
  893.     ws("    EchoLine kVerbose, ""    SNMP               : "" & BoolStr(SNMP) ")
  894.     ws("    EchoLine kVerbose, ""    SNMPDeviceIndex    : "" & CStr(SNMPDeviceIndex) ")
  895.     ws("    EchoLine kVerbose, ""    CommunityName      : "" & CommunityName ")
  896.     blank
  897.  
  898.     '
  899.     ' The code that installs the port
  900.     '
  901.     ws("    dim oMaster")
  902.     ws("    dim oPort")
  903.     blank
  904.  
  905.     ws("    set oMaster = CreateObject(""PrintMaster.PrintMaster.1"")")
  906.     ws("    set oPort   = CreateObject(""Port.Port.1"")")
  907.     blank
  908.  
  909.     ws("    oPort.ServerName         = strServerName")
  910.     ws("    oPort.PortName           = strPortName")
  911.     ws("    oPort.PortType           = kTcpRaw" )
  912.     ws("    oPort.HostAddress        = strHostAddress")
  913.     ws("    oPort.PortNumber         = PortNumber")
  914.     ws("    oPort.SNMP               = SNMP")
  915.     ws("    oPort.SNMPDeviceIndex    = SNMPDeviceIndex")
  916.     ws("    oPort.CommunityName      = CommunityName")
  917.     blank
  918.  
  919.     ws("    oMaster.PortAdd oPort")
  920.     blank
  921.  
  922.     ws("    if Err = 0 or Err.Number = &H80070034  then")
  923.     blank
  924.  
  925.     ws("        if Err = 0 then")
  926.     ws("            EchoLine kVerbose, ""Success: Port "" & strPortName & "" (" & Description(kTcpRaw) & ") added to server "" & strServerName ")
  927.     ws("            iSuccessCount = iSuccessCount + 1")
  928.     ws("        else")
  929.     ws("            EchoLine kVerbose, ""Port "" & strPortName & "" (" & Description(kTcpRaw) & ") already exists on server "" & strServerName ")
  930.     ws("            iExistCount = iExistCount + 1")
  931.     ws("        end if")
  932.     blank
  933.  
  934.     ws("    else")
  935.     blank
  936.  
  937.     ws("        EchoLine kNormal, ""Error: adding port "" & strPortName & "" (" & Description(kTcpRaw) & "), error: 0x"" & hex(Err.Number) ")
  938.     ws("        if Err.Description <> """" then ")
  939.     ws("            EchoLine kNormal,  ""       Error description: "" & Err.Description ")
  940.     ws("        end if")
  941.     ws("        Err.Clear")
  942.     blank
  943.  
  944.  
  945.     ws("    end if")
  946.     blank
  947.  
  948.     ws("    EchoLine kVerbose, """"")
  949.     blank
  950.  
  951.     ws("end sub")
  952.     blank
  953.  
  954. end sub
  955.  
  956. '
  957. ' Subroutine of "AddTCPLprPort"
  958. '
  959. sub ScriptAddTCPLprPort
  960.  
  961.     '
  962.     ' Insert the comment line before the function header
  963.     '
  964.     blank
  965.     ws("'")
  966.     ws("' Add a Tcp lpr port")
  967.     ws("'")
  968.  
  969.     '
  970.     ' The function header
  971.     '
  972.     ws("sub AddTCPLprPort(ByVal strServerName,         _")
  973.     ws("                  ByVal strPortName,           _")
  974.     ws("                  ByVal strHostAddress,        _")
  975.     ws("                  ByVal PortNumber,            _")
  976.     ws("                  ByVal QueueName,             _")
  977.     ws("                  ByVal SNMP,                  _")
  978.     ws("                  ByVal SNMPDeviceIndex,       _")
  979.     ws("                  ByVal CommunityName,         _")
  980.     ws("                  ByVal DoubleSpool            _")
  981.     ws(")")
  982.     blank
  983.  
  984.     '
  985.     ' The function body
  986.     '
  987.     ws("    on error resume next")
  988.     blank
  989.  
  990.     '
  991.     ' Print out the information about the port that is about to be installed
  992.     '
  993.     ws("    iPortCount = iPortCount + 1")
  994.     ws("    EchoLine kVerbose, ""Port:"" & CStr(iPortCount) ")
  995.     ws("    EchoLine kVerbose, ""    ServerName         : "" & strServerName ")
  996.     ws("    EchoLine kVerbose, ""    PortName           : "" & strPortName ")
  997.     ws("    EchoLine kVerbose, ""    PortType           : "  & Description(kTcpLpr) & """")
  998.     ws("    EchoLine kVerbose, ""    HostAddress        : "" & strHostAddress ")
  999.     ws("    EchoLine kVerbose, ""    PortNumber         : "" & CStr(PortNumber) ")
  1000.     ws("    EchoLine kVerbose, ""    QueueName          : "" &  QueueName ")
  1001.     ws("    EchoLine kVerbose, ""    SNMP               : "" & BoolStr(SNMP) ")
  1002.     ws("    EchoLine kVerbose, ""    SNMPDeviceIndex    : "" & CStr(SNMPDeviceIndex) ")
  1003.     ws("    EchoLine kVerbose, ""    CommunityName      : "" & CommunityName ")
  1004.     ws("    EchoLine kVerbose, ""    DoubleSpool        : "" & BoolStr(DoubleSpool) ")
  1005.     blank
  1006.  
  1007.     '
  1008.     ' The code that installs the port
  1009.     '
  1010.     ws("    dim oMaster")
  1011.     ws("    dim oPort")
  1012.     blank
  1013.  
  1014.     ws("    set oMaster = CreateObject(""PrintMaster.PrintMaster.1"")")
  1015.     ws("    set oPort   = CreateObject(""Port.Port.1"")")
  1016.     blank
  1017.  
  1018.     ws("    oPort.ServerName         = strServerName")
  1019.     ws("    oPort.PortName           = strPortName")
  1020.     ws("    oPort.PortType           = kTcpLpr" )
  1021.     ws("    oPort.HostAddress        = strHostAddress")
  1022.     ws("    oPort.PortNumber         = PortNumber")
  1023.     ws("    oPort.QueueName          = QueueName")
  1024.     ws("    oPort.SNMP               = SNMP")
  1025.     ws("    oPort.SNMPDeviceIndex    = SNMPDeviceIndex")
  1026.     ws("    oPort.CommunityName      = CommunityName")
  1027.     ws("    oPort.DoubleSpool        = DoubleSpool")
  1028.     blank
  1029.  
  1030.     ws("    oMaster.PortAdd oPort")
  1031.     blank
  1032.  
  1033.     ws("    if Err = 0 or Err.Number = &H80070034 then")
  1034.     blank
  1035.  
  1036.     ws("        if Err = 0 then")
  1037.     ws("            EchoLine kVerbose, ""Success: Port "" & strPortName & "" (" & Description(kTcpRaw) & ") added to server "" & strServerName ")
  1038.     ws("            iSuccessCount = iSuccessCount + 1")
  1039.     ws("        else")
  1040.     ws("            EchoLine kVerbose, ""Port "" & strPortName & "" (" & Description(kTcpRaw) & ") already exists on server "" & strServerName ")
  1041.     ws("            iExistCount = iExistCount + 1")
  1042.     ws("        end if")
  1043.     blank
  1044.  
  1045.     ws("    else")
  1046.     blank
  1047.  
  1048.     ws("        EchoLine kNormal, ""Error: adding port "" & strPortName & "" (" & Description(kTcpLpr) & "), error: 0x"" & Hex(Err.Number) ")
  1049.     ws("        if Err.Description <> """" then ")
  1050.     ws("            EchoLine kVerbose,  ""       Error description: "" & Err.Description ")
  1051.     ws("        end if")
  1052.     ws("        Err.Clear")
  1053.     blank
  1054.  
  1055.  
  1056.     ws("    end if")
  1057.     blank
  1058.  
  1059.     ws("    EchoLine kVerbose, """"")
  1060.     blank
  1061.  
  1062.     ws("end sub")
  1063.     blank
  1064.  
  1065. end sub
  1066.  
  1067. '
  1068. ' Subroutine of "DeletePort"
  1069. '
  1070. sub ScriptDeletePort
  1071.  
  1072.     '
  1073.     ' Insert the comment line before the function header
  1074.     '
  1075.     blank
  1076.     ws("'")
  1077.     ws("' Delete an existing port")
  1078.     ws("'")
  1079.  
  1080.     '
  1081.     ' The function header
  1082.     '
  1083.     ws("sub DeletePort(ByVal strServerName,         _")
  1084.     ws("               ByVal strPortName            _")
  1085.     ws(")")
  1086.     blank
  1087.  
  1088.     '
  1089.     ' The function body
  1090.     '
  1091.     ws("    on error resume next")
  1092.     blank
  1093.  
  1094.     '
  1095.     ' If the user asks for keeping the original port, then don't delete it
  1096.     '
  1097.     ws("    if bKeepOriginalOnes = true then")
  1098.     blank
  1099.     ws("        exit sub")
  1100.     blank
  1101.     ws("    end if")
  1102.     blank
  1103.  
  1104.     '
  1105.     ' Print out the information about the port that is about to be deleted
  1106.     '
  1107.     ws("    EchoLine kVerbose, ""  Deleting Port: """)
  1108.     ws("    EchoLine kVerbose, ""    ServerName         : "" & strServerName ")
  1109.     ws("    EchoLine kVerbose, ""    PortName           : "" & strPortName ")
  1110.     blank
  1111.  
  1112.     '
  1113.     ' The code that deletes the port
  1114.     '
  1115.     ws("    dim oMaster")
  1116.     ws("    dim oPort")
  1117.     blank
  1118.  
  1119.     ws("    set oMaster = CreateObject(""PrintMaster.PrintMaster.1"")")
  1120.     ws("    set oPort   = CreateObject(""Port.Port.1"")")
  1121.     blank
  1122.  
  1123.     ws("    oPort.ServerName = strServerName")
  1124.     ws("    oPort.PortName   = strPortName")
  1125.     blank
  1126.  
  1127.     ws("    oMaster.PortDel oPort")
  1128.     blank
  1129.  
  1130.     ws("    if Err = 0 then")
  1131.     blank
  1132.  
  1133.     ws("        EchoLine kVerbose, ""  Success: Delete Port"" ")
  1134.     blank
  1135.  
  1136.     ws("    else")
  1137.     blank
  1138.  
  1139.     ws("        EchoLine kVerbose, ""  Error deleting port. Error: 0x"" & hex(Err.Number)")
  1140.     ws("        if Err.Description <> """" then ")
  1141.     ws("            EchoLine kVerbose,  ""       Error description: "" & Err.Description ")
  1142.     ws("        end if")
  1143.     ws("        Err.Clear")
  1144.     blank
  1145.  
  1146.     ws("    end if")
  1147.     blank
  1148.  
  1149.     ws("    EchoLine kVerbose, """"")
  1150.     blank
  1151.  
  1152.     ws("end sub")
  1153.     blank
  1154.  
  1155. end sub
  1156.  
  1157. '
  1158. ' StartUp script for cloning ports
  1159. '
  1160. sub PortStartUp
  1161.  
  1162.     '
  1163.     ' Start creating the port cloning script
  1164.     '
  1165.     CopyrightScript
  1166.     PortAbstractScript
  1167.  
  1168.     '
  1169.     ' The script program starts
  1170.     '
  1171.     blank
  1172.     ws("option explicit")
  1173.     blank
  1174.  
  1175.     ws("'")
  1176.     ws("' Verbose Level")
  1177.     ws("'")
  1178.     ws("const kNormal    = 0")
  1179.     ws("const kVerbose   = 1")
  1180.     blank
  1181.  
  1182.     ws("'")
  1183.     ws("' Port Types")
  1184.     ws("'")
  1185.     ws("const kTcpRaw   = 1")
  1186.     ws("const kTcpLpr   = 2")
  1187.     ws("const kLocal    = 3")
  1188.     ws("const kLprMon   = 5")
  1189.     ws("const kHPdlc    = 7")
  1190.     ws("const kUnknown  = 8")
  1191.     blank
  1192.  
  1193.     ws("'")
  1194.     ws("' Flag, set if users don't want to replace the old ports")
  1195.     ws("'")
  1196.     ws("dim bKeepOriginalOnes")
  1197.     blank
  1198.  
  1199.     ws("dim strDestServer")
  1200.     blank
  1201.  
  1202.     ws("' The number of ports to be installed")
  1203.     blank
  1204.     ws("dim iPortCount")
  1205.     blank
  1206.     ws("' The number of ports sucessfully installed or that already exist")
  1207.     blank
  1208.     ws("dim iSuccessCount")
  1209.     ws("dim iExistCount")
  1210.     blank
  1211.     ws("dim bVerbose")
  1212.     blank
  1213.  
  1214.     ws("main")
  1215.     blank
  1216.     ws("'")
  1217.     ws("' Main execution starts here")
  1218.     ws("'")
  1219.  
  1220.     ws("sub main")
  1221.     blank
  1222.     ws("    bVerbose = false")
  1223.     ws("    bKeepOriginalOnes=false")
  1224.     ws("    iPortCount  = 0")
  1225.     ws("    iSuccessCount = 0")
  1226.     ws("    iExistCount = 0")
  1227.     ws("    strDestServer = """"")
  1228.     ws("    ParseCommandLine")
  1229.     blank
  1230.  
  1231. end sub
  1232.  
  1233. '
  1234. ' CleanUp script for cloning ports
  1235. '
  1236. sub PortCleanUp
  1237.  
  1238.     ws("end sub")
  1239.  
  1240.     '
  1241.     ' Append the subroutine "AddLocalPort"
  1242.     '
  1243.     ScriptAddLocalPort
  1244.  
  1245.     '
  1246.     ' Append the subroutine "AddTCPRawPort"
  1247.     '
  1248.     ScriptAddTCPRawPort
  1249.  
  1250.     '
  1251.     ' Append the subroutine "AddTCPLprPort"
  1252.     '
  1253.     ScriptAddTCPLprPort
  1254.  
  1255.     '
  1256.     ' Append the subroutine "DeletePort"
  1257.     '
  1258.     ScriptDeletePort
  1259.  
  1260.     '
  1261.     ' Append the function "BoolStr"
  1262.     '
  1263.     BoolStrScript
  1264.  
  1265.     '
  1266.     ' Append the command line parsing script
  1267.     '
  1268.     ParseCommandLineScript
  1269.  
  1270.     '
  1271.     ' Append the Usage script
  1272.     '
  1273.     PortUsageScript
  1274.  
  1275.     '
  1276.     ' Append the output macro
  1277.     '
  1278.     EchoLineScript
  1279.  
  1280. end sub
  1281.  
  1282. '
  1283. ' Abstract for the port cloning script
  1284. '
  1285. sub PortAbstractScript
  1286.  
  1287.     ws("' Abstract:")
  1288.     ws("'")
  1289.     ws("' " & strScriptName & " - port cloning script for Windows 2000")
  1290.     ws("'")
  1291.     oScript.WriteLine(kLongLineStr)
  1292.  
  1293. end sub
  1294.  
  1295. '
  1296. ' The Usage script used in the port cloning script
  1297. '
  1298. sub PortUsageScript
  1299.  
  1300.     blank
  1301.     ws("'")
  1302.     ws("' Display command usage.")
  1303.     ws("'")
  1304.     ws("sub Usage(ByVal bExit)")
  1305.     blank
  1306.  
  1307.     ws("    EchoLine kNormal, ""Usage: " & strScriptName & " [-c Destination_Server] [-kv]"" ")
  1308.     ws("    EchoLine kNormal, ""Arguments:"" ")
  1309.     ws("    EchoLine kNormal, ""    -c   - destination server name"" ")
  1310.     ws("    EchoLine kNormal, ""    -k   - keep the existing port with the same name"" ")
  1311.     ws("    EchoLine kNormal, ""           (WARNING: If this flag is set, the cloned server may not be identical to the original one."" ")
  1312.     ws("    EchoLine kNormal, ""    -v   - verbose mode"" ")
  1313.     ws("    EchoLine kNormal, ""    -?   - display command usage"" ")
  1314.     ws("    EchoLine kNormal, """" ")
  1315.     ws("    EchoLine kNormal, ""Examples:"" ")
  1316.     ws("    EchoLine kNormal, ""    " & strScriptName & """ ")
  1317.     blank
  1318.  
  1319.     ws("    if bExit then")
  1320.     ws("        wscript.quit(1)")
  1321.     ws("    end if")
  1322.     blank
  1323.  
  1324.     ws("end sub")
  1325.     blank
  1326.  
  1327. end sub
  1328.  
  1329. '
  1330. ' Gets a string description for a port type
  1331. '
  1332. function Description(ByVal value)
  1333.  
  1334.     select case value
  1335.  
  1336.            case kTcpRaw
  1337.  
  1338.                 Description = "TCP RAW Port"
  1339.  
  1340.            case kTcpLpr
  1341.  
  1342.                 Description = "TCP LPR Port"
  1343.  
  1344.            case kLocal
  1345.  
  1346.                 Description = "Standard Local Port"
  1347.  
  1348.            case kLprMon
  1349.  
  1350.                 Description = "LPR Mon Port"
  1351.  
  1352.            case kHPdlc
  1353.  
  1354.                 Description = "HP DLC Port"
  1355.  
  1356.            case kUnknown
  1357.  
  1358.                 Description = "Unknown Port"
  1359.  
  1360.            case Else
  1361.  
  1362.                 Description = "Invalid PortType"
  1363.     end select
  1364.  
  1365. end function
  1366.  
  1367. '
  1368. '------------------------------------------------------------------------
  1369. '      Printer cloning script
  1370. '------------------------------------------------------------------------
  1371. '
  1372. sub PrinterCloneScript(ByVal strScriptName, ByVal strServerName)
  1373.  
  1374.     on error resume next
  1375.  
  1376.     wscript.echo
  1377.     wscript.echo "Creating the printer cloning script..."
  1378.  
  1379.     dim strPersistFilename
  1380.  
  1381.     '
  1382.     ' Open the script file
  1383.     '
  1384.     set oScript = oFileSystem.CreateTextFile(strScriptName,TRUE)
  1385.  
  1386.     PrinterStartUp
  1387.  
  1388.     ws("    EchoLine kNormal, """" ")
  1389.     ws("    EchoLine kNormal, ""------------------------------"" ")
  1390.     ws("    EchoLine kNormal, ""Start installing printers..."" ")
  1391.  
  1392.     '
  1393.     ' Enumerate all the printers in server "strServerName",
  1394.     ' for each printer found, add a line in the script to
  1395.     ' call the AddPrinter subroutine
  1396.     '
  1397.     dim oMaster
  1398.     dim oPrinter
  1399.     dim iPrinterCount
  1400.     dim strPrinterName
  1401.  
  1402.     iPrinterCount = 0
  1403.     set oMaster  = CreateObject("PrintMaster.PrintMaster.1")
  1404.     for each oPrinter in oMaster.Printers(strServerName)
  1405.  
  1406.         if Err = 0 then
  1407.            '
  1408.            ' Check to see if we need to clone this printer
  1409.            ' We only clone local printers
  1410.            '
  1411.  
  1412.            if bIsLocal(strServerName, oPrinter.PrinterName) then
  1413.  
  1414.                '
  1415.                ' Remove the ServerName part of the PrinterName
  1416.                '
  1417.                strPrinterName = Strip(oPrinter.PrinterName)
  1418.  
  1419.                '
  1420.                ' Try deleting the existing printer
  1421.                '
  1422.                ws("    DeletePrinter  strDestServer,  _")
  1423.                ws("                   """ & StuffQuote(strPrinterName) & """")
  1424.  
  1425.                '
  1426.                ' Add a call to "AddPrinter"
  1427.                '
  1428.                iPrinterCount = iPrinterCount + 1
  1429.                ws("    AddPrinter  strDestServer, _")
  1430.                ws("                """ & StuffQuote(strPrinterName)  & """,  _")
  1431.                ws("                """ & oPrinter.DriverName   & """,  _")
  1432.                ws("                """ & StuffQuote(oPrinter.PortName)  & """,  _")
  1433.                ws("                """",  _")               ' Use default DriverPath
  1434.                ws("                """"    ")               ' Use default InfFile
  1435.  
  1436.                '
  1437.                ' Persist save the printer
  1438.                '
  1439.                strPersistFilename = strPrefixServerName & "per" & CStr(iPrinterCount) & "_clone.vbs"
  1440.                if SavePrinter( oPrinter.PrinterName, strPersistFilename ) = false then
  1441.  
  1442.                    wscript.echo "Error: skipping printer """ & oPrinter.PrinterName & """ persist save due to the error when getting the persist information"
  1443.  
  1444.                else
  1445.  
  1446.                    '
  1447.                    ' Add script for calling persist restore
  1448.                    '
  1449.                    ws("    RestorePrinter strDestServer, """ & strPrinterName & """, """ & strPersistFilename & """" )
  1450.                    wscript.echo "Printer Name: """ &  strPrinterName  & """    <==>    Persist filename: " & strPersistFilename
  1451.  
  1452.                end if
  1453.  
  1454.                blank
  1455.  
  1456.            else
  1457.  
  1458.                '
  1459.                ' It is not a local printer. Don't clone it.
  1460.                '
  1461.                wscript.echo "Skipping non-local printer: """ & oPrinter.PrinterName & """."
  1462.  
  1463.            end if
  1464.  
  1465.         else
  1466.  
  1467.             '
  1468.             ' Clean up
  1469.             '
  1470.             oScript.Close
  1471.  
  1472.             oFileSystem.DeleteFile strScriptName
  1473.  
  1474.             wscript.echo "Error: Listing printers, error: 0x" & Hex(Err.Number)
  1475.             if Err.Description <> "" then
  1476.                wscript.echo "Error description: " & Err.Description
  1477.             end if
  1478.  
  1479.             exit sub
  1480.  
  1481.         end if
  1482.  
  1483.     next
  1484.  
  1485.     if Err = 0 then
  1486.  
  1487.         wscript.echo "Success: Listing printers on Server " & strServerName
  1488.  
  1489.     else
  1490.  
  1491.         wscript.echo "Error: Listing printers, error: 0x" & Hex(Err.Number)
  1492.         if Err.Description <> "" then
  1493.             wscript.echo "Error description: " & Err.Description
  1494.         end if
  1495.  
  1496.         Err.Clear
  1497.  
  1498.     end if
  1499.  
  1500.     '
  1501.     ' Write the summary
  1502.     '
  1503.     wscript.echo "A total of " & CSTR(iPrinterCount) & " printers are listed."
  1504.  
  1505.     ws("    EchoLine kNormal, ""Attempted to install a total of "" & CStr(iPrinterCount) & "" printer(s)."" ")
  1506.     ws("    EchoLine kNormal, CStr(iSuccessCount) & "" printer(s) were successfully installed."" ")
  1507.  
  1508.  
  1509.     if strServerName = "" then
  1510.  
  1511.         '
  1512.         ' If the source server is local, get and set the default printer
  1513.         '
  1514.         dim strDefaultPrinterName
  1515.         set oMaster = CreateObject("PrintMaster.PrintMaster.1")
  1516.         strDefaultPrinterName = StuffQuote(oMaster.DefaultPrinter)
  1517.  
  1518.         if Err <> 0 then
  1519.  
  1520.             wscript.echo "Error: Getting default printer """ & oMaster.DefaultPrinter & """, error: 0x" & Hex(Err.Number)
  1521.             if Err.Description <> "" then
  1522.                 wscript.echo "Error description: " & Err.Description
  1523.             end if
  1524.  
  1525.             Err.Clear
  1526.  
  1527.         else
  1528.  
  1529.             '
  1530.             ' Setting the default printer
  1531.             '
  1532.             blank
  1533.             ws("'")
  1534.             ws("' Set the default printer")
  1535.             ws("'   (do this only if the installation is on the local machine)")
  1536.             ws("'")
  1537.             ws("    if strDestServer = """" then ")
  1538.             blank
  1539.             ws("        dim oMaster")
  1540.             ws("        set oMaster = CreateObject(""PrintMaster.PrintMaster.1"") ")
  1541.             ws("        oMaster.DefaultPrinter = """ & strDefaultPrinterName & """" )
  1542.             blank
  1543.             ws("        if Err = 0 then")
  1544.             ws("            EchoLine kNormal, ""Success: Setting the default printer to """"" & strDefaultPrinterName & """"" "" " )
  1545.             ws("        else")
  1546.             ws("            EchoLine kNormal, ""Error: Setting default printer "" &  strDefaultPrinterName ")
  1547.             ws("        end if")
  1548.             blank
  1549.             ws("    end if")
  1550.             blank
  1551.  
  1552.         end if
  1553.  
  1554.     end if
  1555.  
  1556.     PrinterCleanUp
  1557.  
  1558.     '
  1559.     ' Close the script file
  1560.     '
  1561.     oScript.Close
  1562.  
  1563.     wscript.echo "The script file for cloning printers is """ & strScriptName & """."
  1564.  
  1565. end sub
  1566.  
  1567. '
  1568. ' Subroutine of "AddPrinter"
  1569. '
  1570. sub ScriptAddPrinter
  1571.  
  1572.     '
  1573.     ' Insert the comment line before the function header
  1574.     '
  1575.     blank
  1576.     ws("'")
  1577.     ws("' Add a printer")
  1578.     ws("'")
  1579.  
  1580.     '
  1581.     ' The function header
  1582.     '
  1583.     ws("sub AddPrinter(ByVal strServerName,       _")
  1584.     ws("               ByVal strPrinterName,      _")
  1585.     ws("               ByVal strDriverName,       _")
  1586.     ws("               ByVal strPortName,         _")
  1587.     ws("               ByVal strDriverPath,       _")
  1588.     ws("               ByVal strInfFile           _")
  1589.     ws(")")
  1590.     blank
  1591.  
  1592.     '
  1593.     ' The function body
  1594.     '
  1595.     ws("    on error resume next")
  1596.     blank
  1597.  
  1598.     '
  1599.     ' Print out the information about the printer that is about to be installed
  1600.     '
  1601.     ws("    iPrinterCount = iPrinterCount + 1")
  1602.     ws("    EchoLine kVerbose, ""Printer:"" & CSTR(iPrinterCount)                  ")
  1603.     ws("    EchoLine kVerbose, ""    ServerName      : "" & strServerName          ")
  1604.     ws("    EchoLine kVerbose, ""    PrinterName     : "" & strPrinterName         ")
  1605.     ws("    EchoLine kVerbose, ""    DriverName      : "" & strDriverName          ")
  1606.     ws("    EchoLine kVerbose, ""    PortName        : "" & strPortName            ")
  1607.     blank
  1608.  
  1609.     '
  1610.     ' The codes that installs the printer
  1611.     '
  1612.     ws("    dim oMaster")
  1613.     ws("    dim oPrinter")
  1614.     blank
  1615.  
  1616.     ws("    set oMaster = CreateObject(""PrintMaster.PrintMaster.1"")")
  1617.     ws("    set oPrinter = CreateObject(""Printer.Printer.1"")")
  1618.     blank
  1619.  
  1620.     ws("    oPrinter.ServerName       = strServerName     ")
  1621.     ws("    oPrinter.PrinterName      = strPrinterName    ")
  1622.     ws("    oPrinter.DriverName       = strDriverName     ")
  1623.     ws("    oPrinter.PortName         = strPortName       ")
  1624.     ws("    oPrinter.DriverPath       = strDriverPath     ")
  1625.     ws("    oPrinter.InfFile          = strInfFile        ")
  1626.     blank
  1627.  
  1628.     ws("    oMaster.PrinterAdd oPrinter")
  1629.     blank
  1630.  
  1631.     ws("    if Err = 0 then")
  1632.     blank
  1633.  
  1634.     ws("        EchoLine kVerbose, ""Success: Printer "" & strPrinterName & "" added to server "" & strServerName ")
  1635.     ws("        iSuccessCount = iSuccessCount + 1")
  1636.     blank
  1637.  
  1638.     ws("    else")
  1639.     blank
  1640.  
  1641.     ws("        EchoLine kNormal, ""Error adding printer "" & strPrinterName & "", error: 0x"" & Hex(Err.Number) ")
  1642.     ws("        if Err.Description <> """" then ")
  1643.     ws("            EchoLine kVerbose,  ""       Error description: "" & Err.Description ")
  1644.     ws("        end if")
  1645.     ws("        Err.Clear")
  1646.     blank
  1647.  
  1648.  
  1649.     ws("    end if")
  1650.     blank
  1651.  
  1652.     ws("    EchoLine kVerbose, """"")
  1653.     blank
  1654.  
  1655.     ws("end sub")
  1656.     blank
  1657.  
  1658. end sub
  1659.  
  1660. '
  1661. ' Save printer configuration
  1662. '
  1663. function SavePrinter(ByVal strPrinterName, ByVal strFileName)
  1664.  
  1665.     on error resume next
  1666.  
  1667.     dim oMaster
  1668.     set oMaster = CreateObject("PrintMaster.PrintMaster.1")
  1669.  
  1670.     oMaster.PrinterPersistSave strPrinterName, strFileName, kAllSettings
  1671.  
  1672.     if Err <> 0 then
  1673.  
  1674.         wscript.echo "Error saving the configuration of the printer """ & strPrinterName & """, error: 0x" & Hex(Err.Number)
  1675.  
  1676.         SavePrinter = false
  1677.  
  1678.     else
  1679.  
  1680.         SavePrinter = true
  1681.  
  1682.     end if
  1683.  
  1684. end function
  1685.  
  1686. '
  1687. ' Script for printer persist restore
  1688. '
  1689. sub RestorePrinterScript()
  1690.  
  1691.     ws("'")
  1692.     ws("' Restore printer configuration")
  1693.     ws("'")
  1694.     blank
  1695.  
  1696.     ws("sub RestorePrinter(ByVal strServerName, ByVal strPrinterName, ByVal strFileName)")
  1697.     blank
  1698.  
  1699.     ws("    on error resume next")
  1700.     blank
  1701.  
  1702.     ws("    dim oMaster")
  1703.     ws("    set oMaster = CreateObject(""PrintMaster.PrintMaster.1"") ")
  1704.     blank
  1705.  
  1706.     ws("    oMaster.PrinterPersistRestore strFullName(strServerName, strPrinterName), strFileName, _")
  1707.     ws("      kAllSettings + kResolveName + kReslovePort + kResolveShare")
  1708.     blank
  1709.  
  1710.     ws("    if Err = 0 then")
  1711.     ws("        EchoLine kVerbose, ""Success restoring the configuration of the printer"" & strPrinterName ")
  1712.     ws("        EchoLine kVerbose, """" ")
  1713.     ws("    else")
  1714.     ws("        if Err.Number = kErrorNoDs then")
  1715.     ws("            Err.Clear")
  1716.     ws("            '")
  1717.     ws("            ' Try resoring without Printer Info 7")
  1718.     ws("            '")
  1719.     ws("           oMaster.PrinterPersistRestore strFullName(strServerName, strPrinterName), strFileName, _")
  1720.     ws("           kPersistNoDs + kResolveName + kReslovePort + kResolveShare")
  1721.     ws("        end if")
  1722.     ws("")
  1723.     ws("        if Err = 0 then")
  1724.     ws("            EchoLine kVerbose, ""Success restoring the configuration of the printer"" & strPrinterName ")
  1725.     ws("            EchoLine kVerbose, """" ")
  1726.     ws("        else")
  1727.     ws("            EchoLine kNormal, ""Error restoring the configuration of the printer "" & strPrinterName & "", error: 0x"" & Hex(Err.Number)")
  1728.     ws("            EchoLine kNormal, """" ")
  1729.     ws("            Err.Clear")
  1730.     ws("        end if")
  1731.     ws("    end if")
  1732.     blank
  1733.  
  1734.     ws("end sub")
  1735.     blank
  1736.  
  1737. end sub
  1738.  
  1739. '
  1740. ' Subroutine of "DeletePrinter"
  1741. '
  1742. sub ScriptDeletePrinter
  1743.  
  1744.     '
  1745.     ' Insert the comment line before the function header
  1746.     '
  1747.     blank
  1748.     ws("'")
  1749.     ws("' Delete an existing printer")
  1750.     ws("'")
  1751.  
  1752.     '
  1753.     ' The function header
  1754.     '
  1755.     ws("sub DeletePrinter(ByVal strServerName,         _")
  1756.     ws("                  ByVal strPrinterName         _")
  1757.     ws(")")
  1758.     blank
  1759.  
  1760.     '
  1761.     ' The function body
  1762.     '
  1763.     ws("    on error resume next")
  1764.     blank
  1765.  
  1766.     '
  1767.     ' If the user asks for keeping the original printer, then don't delete it
  1768.     '
  1769.     ws("    if bKeepOriginalOnes = true then")
  1770.     blank
  1771.     ws("        exit sub")
  1772.     blank
  1773.     ws("    end if")
  1774.     blank
  1775.  
  1776.     '
  1777.     ' Print out the information about the printer that is about to be deleted
  1778.     '
  1779.     ws("    EchoLine kVerbose, ""  Deleting Printer: """)
  1780.     ws("    EchoLine kVerbose, ""    ServerName         : "" & strServerName ")
  1781.     ws("    EchoLine kVerbose, ""    PrinterName        : "" & strPrinterName ")
  1782.     blank
  1783.  
  1784.     '
  1785.     ' The code that deletes the printer
  1786.     '
  1787.     ws("    dim oMaster")
  1788.     ws("    dim oPrinter")
  1789.     blank
  1790.  
  1791.     ws("    set oMaster = CreateObject(""PrintMaster.PrintMaster.1"")")
  1792.     ws("    set oPrinter = CreateObject(""Printer.Printer.1"")")
  1793.     blank
  1794.  
  1795.     ws("    oPrinter.ServerName       = strServerName     ")
  1796.     ws("    oPrinter.PrinterName      = strPrinterName    ")
  1797.     blank
  1798.  
  1799.     ws("    oMaster.PrinterDel oPrinter")
  1800.     blank
  1801.  
  1802.     ws("    if Err = 0 then")
  1803.     blank
  1804.  
  1805.     ws("        EchoLine kVerbose, ""  Success: Delete Printer"" ")
  1806.     blank
  1807.  
  1808.     ws("    else")
  1809.     blank
  1810.  
  1811.     ws("        EchoLine kVerbose, ""  Error deleting printer "" & strPrinterName & "". Error: 0x"" & Hex(Err.Number)")
  1812.     ws("        if Err.Description <> """" then ")
  1813.     ws("            EchoLine kVerbose,  ""       Error description: "" & Err.Description ")
  1814.     ws("        end if")
  1815.     ws("        Err.Clear")
  1816.     blank
  1817.  
  1818.     ws("    end if")
  1819.     blank
  1820.  
  1821.     ws("    EchoLine kVerbose, """"")
  1822.     blank
  1823.  
  1824.     ws("end sub")
  1825.     blank
  1826.  
  1827. end sub
  1828.  
  1829. '
  1830. ' StartUp script for cloning printers
  1831. '
  1832. sub PrinterStartUp
  1833.  
  1834.     '
  1835.     ' Start to create the printer cloning script
  1836.     '
  1837.     CopyrightScript
  1838.     PrinterAbstractScript
  1839.  
  1840.     '
  1841.     ' The script program starts
  1842.     '
  1843.     blank
  1844.     ws("option explicit")
  1845.     blank
  1846.  
  1847.     ws("'")
  1848.     ws("' Verbose Level")
  1849.     ws("'")
  1850.     ws("const kNormal    = 0")
  1851.     ws("const kVerbose   = 1")
  1852.     blank
  1853.  
  1854.     '
  1855.     '  Add the printer persist constants
  1856.     '
  1857.     ws("'")
  1858.     ws("' Constants for printer persist")
  1859.     ws("'")
  1860.     ws("const kAllSettings            = 127")
  1861.     ws("const kPrinterInfo7           = 4")
  1862.     ws("const kResolveName            = 256")
  1863.     ws("const kReslovePort            = 512")
  1864.     ws("const kResolveShare           = 1024")
  1865.     ws("'")
  1866.     ws("'")
  1867.     ws("' If the DS is not present, restore printer without Printer Info 7")
  1868.     ws("'")
  1869.     ws("const kPersistNoDs            = 123")
  1870.     ws("const kErrorNoDs              = &H8004000C")
  1871.     blank
  1872.  
  1873.     ws("'")
  1874.     ws("' Flag, set if users don't want to replace the old forms")
  1875.     ws("'")
  1876.     ws("dim bKeepOriginalOnes")
  1877.     blank
  1878.  
  1879.     ws("dim strDestServer")
  1880.     blank
  1881.  
  1882.     ws("' The number of printers to be installed")
  1883.     blank
  1884.     ws("dim iPrinterCount")
  1885.     blank
  1886.     ws("' The number of printers sucessfully installed")
  1887.     blank
  1888.     ws("dim iSuccessCount")
  1889.     blank
  1890.     ws("dim bVerbose")
  1891.     blank
  1892.  
  1893.     ws("main")
  1894.     blank
  1895.     ws("'")
  1896.     ws("' Main execution starts here")
  1897.     ws("'")
  1898.  
  1899.     ws("sub main")
  1900.     blank
  1901.     ws("    bVerbose = false")
  1902.     ws("    bKeepOriginalOnes=false")
  1903.     ws("    iPrinterCount  = 0")
  1904.     ws("    iSuccessCount = 0")
  1905.     ws("    strDestServer = """"")
  1906.     ws("    ParseCommandLine")
  1907.     blank
  1908.  
  1909. end sub
  1910.  
  1911. '
  1912. ' CleanUp script for cloning printers
  1913. '
  1914. sub PrinterCleanUp
  1915.  
  1916.     ws("end sub")
  1917.  
  1918.     ' Append the subroutine "AddPrinter"
  1919.     ScriptAddPrinter
  1920.  
  1921.     '
  1922.     ' Append the subroutine "RestorePrinter"
  1923.     '
  1924.     RestorePrinterScript
  1925.  
  1926.     '
  1927.     ' Append the subroutine "DeletePrinter"
  1928.     '
  1929.     ScriptDeletePrinter
  1930.  
  1931.     '
  1932.     ' Append the script for creating the full name for the printer
  1933.     '
  1934.     strFullNameScript
  1935.  
  1936.     '
  1937.     ' Append the command line parsing script
  1938.     '
  1939.     ParseCommandLineScript
  1940.  
  1941.     '
  1942.     ' Append the Usage script
  1943.     '
  1944.     PrinterUsageScript
  1945.  
  1946.     '
  1947.     ' Append the output macro
  1948.     '
  1949.     EchoLineScript
  1950.  
  1951. end sub
  1952.  
  1953. '
  1954. ' Script for creating the full printer name (containing ServerName and PrinterName)
  1955. ' which is used in RestorePrinter
  1956. '
  1957. function strFullNameScript()
  1958.  
  1959.     ws("'")
  1960.     ws("' Function for creating the full printer name")
  1961.     ws("'")
  1962.     ws("function strFullName(ByVal strServerName, ByVal strPrinterName)")
  1963.     blank
  1964.     ws("    if strServerName = """" then")
  1965.     blank
  1966.     ws("        strFullName = strPrinterName")
  1967.     blank
  1968.     ws("    else")
  1969.     blank
  1970.     ws("        strFullName = strServerName & ""\"" & strPrinterName")
  1971.     blank
  1972.     ws("    end if")
  1973.     blank
  1974.     ws("end function")
  1975.     blank
  1976.  
  1977. end function
  1978.  
  1979. '
  1980. ' Abstract for the printer cloning script
  1981. '
  1982. sub PrinterAbstractScript
  1983.  
  1984.     ws("' Abstract:")
  1985.     ws("'")
  1986.     ws("' " & strScriptName & " - printer cloning script for Windows 2000")
  1987.     ws("'")
  1988.     oScript.WriteLine(kLongLineStr)
  1989.  
  1990. end sub
  1991.  
  1992. '
  1993. ' The Usage script used in the printer cloning script
  1994. '
  1995. sub PrinterUsageScript
  1996.  
  1997.     blank
  1998.     ws("'")
  1999.     ws("' Display command usage.")
  2000.     ws("'")
  2001.     ws("sub Usage(ByVal bExit)")
  2002.     blank
  2003.  
  2004.     ws("    EchoLine kNormal, ""Usage: " & strScriptName & " [-c Destination_Server] [-kv]"" ")
  2005.     ws("    EchoLine kNormal, ""Arguments:"" ")
  2006.     ws("    EchoLine kNormal, ""    -c   - destination server name"" ")
  2007.     ws("    EchoLine kNormal, ""    -k   - keep the existing printer with the same name"" ")
  2008.     ws("    EchoLine kNormal, ""           (WARNING: If this flag is set, the cloned server may not be identical to the original one."" ")
  2009.     ws("    EchoLine kNormal, ""    -v   - verbose mode"" ")
  2010.     ws("    EchoLine kNormal, ""    -?   - display command usage"" ")
  2011.     ws("    EchoLine kNormal, """" ")
  2012.     ws("    EchoLine kNormal, ""Examples:"" ")
  2013.     ws("    EchoLine kNormal, ""    " & strScriptName & """ ")
  2014.     blank
  2015.  
  2016.     ws("    if bExit then")
  2017.     ws("        wscript.quit(1)")
  2018.     ws("    end if")
  2019.     blank
  2020.  
  2021.     ws("end sub")
  2022.     blank
  2023.  
  2024. end sub
  2025.  
  2026. '
  2027. '------------------------------------------------------------------------
  2028. '      Form cloning script
  2029. '------------------------------------------------------------------------
  2030. '
  2031. sub FormCloneScript(ByVal strScriptName, ByVal strServerName)
  2032.  
  2033.     on error resume next
  2034.  
  2035.     wscript.echo
  2036.     wscript.echo   "Creating the form cloning script..."
  2037.  
  2038.     dim iHeight
  2039.     dim iWidth
  2040.     dim iTop
  2041.     dim iLeft
  2042.     dim iBottom
  2043.     dim iRight
  2044.  
  2045.     '
  2046.     ' Open the script file
  2047.     '
  2048.     set oScript = oFileSystem.CreateTextFile(strScriptName,TRUE)
  2049.  
  2050.     FormStartUp
  2051.  
  2052.     ws("    EchoLine kNormal, """" ")
  2053.     ws("    EchoLine kNormal, ""------------------------------"" ")
  2054.     ws("    EchoLine kNormal, ""Start installing forms..."" ")
  2055.  
  2056.     '
  2057.     ' Enumerate all the forms in server "strServerName",
  2058.     ' for each form found, add a line in the script to
  2059.     ' call the AddForm subroutine
  2060.     '
  2061.     dim oMaster
  2062.     dim oForm
  2063.     dim iFormCount
  2064.  
  2065.     iFormCount = 0
  2066.     set oMaster  = CreateObject("PrintMaster.PrintMaster.1")
  2067.     for each oForm in oMaster.Forms(strServerName)
  2068.  
  2069.         if Err = 0 then
  2070.            '
  2071.            ' Try deleting the existing form
  2072.            '
  2073.            ws("    DeleteForm  strDestServer,  _")
  2074.            ws("                """ & StuffQuote(oForm.Name) & """")
  2075.  
  2076.            oForm.GetSize iHeight, iWidth
  2077.            oForm.GetImageableArea  iTop, iLeft, iBottom, iRight
  2078.  
  2079.            iFormCount = iFormCount + 1
  2080.            ws("    AddForm     strDestServer, _")
  2081.            ws("                """ & StuffQuote(oForm.Name)  & """, _")
  2082.            ws("                "   & CStr(oForm.Flags)    & ", _")
  2083.            ws("                "   & CStr(iHeight)  & ", _")
  2084.            ws("                "   & CStr(iWidth)   & ", _")
  2085.            ws("                "   & CStr(iTop)     & ", _")
  2086.            ws("                "   & CStr(iLeft)    & ", _")
  2087.            ws("                "   & CStr(iBottom)  & ", _")
  2088.            ws("                "   & CStr(iRight)   )
  2089.            blank
  2090.  
  2091.         else
  2092.  
  2093.             '
  2094.             ' Clean up
  2095.             '
  2096.             oScript.Close
  2097.  
  2098.             oFileSystem.DeleteFile strScriptName
  2099.  
  2100.             wscript.echo "Error: Listing forms, error: 0x" & Hex(Err.Number)
  2101.             if Err.Description <> "" then
  2102.                 wscript.echo "Error description: " & Err.Description
  2103.             end if
  2104.  
  2105.             exit sub
  2106.  
  2107.         end if
  2108.  
  2109.     next
  2110.  
  2111.     if Err = 0 then
  2112.  
  2113.         wscript.echo "Success: Listing forms on Server " & strServerName
  2114.  
  2115.     else
  2116.  
  2117.         wscript.echo "Error: Listing forms, error: 0x" & Hex(Err.Number)
  2118.         if Err.Description <> "" then
  2119.             wscript.echo "Error description: " & Err.Description
  2120.         end if
  2121.  
  2122.         Err.Clear
  2123.  
  2124.     end if
  2125.  
  2126.     wscript.echo  "A total of " & CSTR(iFormCount) & " forms are listed."
  2127.  
  2128.     ws("    EchoLine kNormal, ""Attempted to install a total of "" & CStr(iFormCount) & "" forms."" ")
  2129.     ws("    EchoLine kNormal, CStr(iSuccessCount) & "" forms successfully installed."" ")
  2130.  
  2131.     FormCleanUp
  2132.  
  2133.     '
  2134.     ' Close the script file
  2135.     '
  2136.     oScript.Close
  2137.  
  2138.     wscript.echo  "The script file for cloning forms is """ & strScriptName & """."
  2139.  
  2140. end sub
  2141.  
  2142. '
  2143. ' Subroutine of "AddForm"
  2144. '
  2145. sub ScriptAddForm
  2146.  
  2147.     '
  2148.     ' Insert the comment line before the function header
  2149.     '
  2150.     blank
  2151.     ws("'")
  2152.     ws("' Add a Form")
  2153.     ws("'")
  2154.  
  2155.     '
  2156.     ' The function header
  2157.     '
  2158.     ws("sub AddForm(ByVal strServerName,         _")
  2159.     ws("            ByVal strName,               _")
  2160.     ws("            ByVal iFlags,                _")
  2161.     ws("            ByVal iHeight,               _")
  2162.     ws("            ByVal iWidth,                _")
  2163.     ws("            ByVal iTop,                  _")
  2164.     ws("            ByVal iLeft,                 _")
  2165.     ws("            ByVal iBottom,               _")
  2166.     ws("            ByVal iRight                 _")
  2167.     ws(")")
  2168.     blank
  2169.  
  2170.     '
  2171.     ' The function body
  2172.     '
  2173.     ws("    on error resume next")
  2174.     blank
  2175.  
  2176.     '
  2177.     ' Print out the information about the form that is about to be installed
  2178.     '
  2179.     ws("    iFormCount = iFormCount + 1")
  2180.     ws("    EchoLine kVerbose, ""Form:"" & CSTR(iFormCount) ")
  2181.     ws("    EchoLine kVerbose, ""    ServerName : "" & strServerName ")
  2182.     ws("    EchoLine kVerbose, ""    Name       : "" & strName ")
  2183.     ws("    EchoLine kVerbose, ""    Type       : "" & CStr(iFlags) ")
  2184.     ws("    EchoLine kVerbose, ""    Height     : "" & CStr(iHeight) ")
  2185.     ws("    EchoLine kVerbose, ""    Width      : "" & CStr(iWidth) ")
  2186.     ws("    EchoLine kVerbose, ""    Top        : "" & CStr(iTop) ")
  2187.     ws("    EchoLine kVerbose, ""    Left       : "" & CStr(iLeft) ")
  2188.     ws("    EchoLine kVerbose, ""    Bottom     : "" & CStr(iBottom) ")
  2189.     ws("    EchoLine kVerbose, ""    Right      : "" & CStr(iRight) ")
  2190.     blank
  2191.  
  2192.     '
  2193.     ' The code that installs the form
  2194.     '
  2195.     ws("    dim oMaster")
  2196.     ws("    dim oForm")
  2197.     blank
  2198.  
  2199.     ws("    set oMaster = CreateObject(""PrintMaster.PrintMaster.1"")")
  2200.     ws("    set oForm = CreateObject(""Form.Form.1"")")
  2201.     blank
  2202.  
  2203.     ws("    oForm.ServerName  = strServerName")
  2204.     ws("    oForm.Name        = strName")
  2205.     ws("    oForm.Flags       = iFlags")
  2206.     ws("    oForm.SetSize iHeight, iWidth")
  2207.     ws("    oForm.SetImageableArea iTop, iLeft, iBottom, iRight")
  2208.     blank
  2209.  
  2210.     ws("    oMaster.FormAdd oForm")
  2211.     blank
  2212.  
  2213.     ws("' If no error or error code is for ""existing form"" then succeed")
  2214.     ws("    if Err = 0 or Err.number = &H80070050 then")
  2215.     blank
  2216.  
  2217.     ws("        EchoLine kVerbose, ""Success: Form "" & strName & "" added to server "" & strServerName ")
  2218.     ws("        iSuccessCount = iSuccessCount + 1")
  2219.     blank
  2220.  
  2221.     ws("    else")
  2222.     blank
  2223.  
  2224.     ws("        EchoLine kNormal, ""Error: adding Form "" & strName & "", error: 0x"" & hex(Err.Number) ")
  2225.     ws("        if Err.Description <> """" then ")
  2226.     ws("            EchoLine kVerbose,  ""       Error description: "" & Err.Description ")
  2227.     ws("        end if")
  2228.     ws("        Err.Clear")
  2229.     blank
  2230.  
  2231.  
  2232.     ws("    end if")
  2233.     blank
  2234.  
  2235.     ws("    EchoLine kVerbose, """"")
  2236.     blank
  2237.  
  2238.     ws("end sub")
  2239.     blank
  2240.  
  2241. end sub
  2242.  
  2243. '
  2244. ' Subroutine of "DeleteForm"
  2245. '
  2246. sub ScriptDeleteForm
  2247.  
  2248.     '
  2249.     ' Insert the comment line before the function header
  2250.     '
  2251.     blank
  2252.     ws("'")
  2253.     ws("' Delete an existing form")
  2254.     ws("'")
  2255.  
  2256.     '
  2257.     ' The function header
  2258.     '
  2259.     ws("sub DeleteForm(ByVal strServerName,         _")
  2260.     ws("               ByVal strFormName            _")
  2261.     ws(")")
  2262.     blank
  2263.  
  2264.     '
  2265.     ' The function body
  2266.     '
  2267.     ws("    on error resume next")
  2268.     blank
  2269.  
  2270.     '
  2271.     ' If the user asks for keeping the original form, then don't delete it
  2272.     '
  2273.     ws("    if bKeepOriginalOnes = true then")
  2274.     blank
  2275.     ws("        exit sub")
  2276.     blank
  2277.     ws("    end if")
  2278.     blank
  2279.  
  2280.     '
  2281.     ' Print out the information about the form that is about to be deleted
  2282.     '
  2283.     ws("    EchoLine kVerbose, ""  Deleting Form: """)
  2284.     ws("    EchoLine kVerbose, ""    ServerName         : "" & strServerName ")
  2285.     ws("    EchoLine kVerbose, ""    FormName           : "" & strFormName ")
  2286.     blank
  2287.  
  2288.     '
  2289.     ' The code that deletes the form
  2290.     '
  2291.     ws("    dim oMaster")
  2292.     ws("    dim oForm")
  2293.     blank
  2294.  
  2295.     ws("    set oMaster = CreateObject(""PrintMaster.PrintMaster.1"")")
  2296.     ws("    set oForm   = CreateObject(""Form.Form.1"")")
  2297.     blank
  2298.  
  2299.     ws("    oForm.Name       = strFormName")
  2300.     ws("    oForm.ServerName = strServerName")
  2301.     ws("    oMaster.FormDel  oForm")
  2302.     blank
  2303.  
  2304.     ws("    if Err = 0 then")
  2305.     blank
  2306.  
  2307.     ws("        EchoLine kVerbose, ""  Success: Delete Form"" & strFormName ")
  2308.     blank
  2309.  
  2310.     ws("    else")
  2311.     blank
  2312.  
  2313.     ws("        EchoLine kVerbose, ""  Error deleting form "" & strFormName & "". Error: 0x"" & hex(Err.Number)")
  2314.     ws("        if Err.Description <> """" then ")
  2315.     ws("            EchoLine kVerbose,  ""       Error description: "" & Err.Description ")
  2316.     ws("        end if")
  2317.     ws("        Err.Clear")
  2318.     blank
  2319.  
  2320.     ws("    end if")
  2321.     blank
  2322.  
  2323.     ws("    EchoLine kVerbose, """"")
  2324.     blank
  2325.  
  2326.     ws("end sub")
  2327.     blank
  2328.  
  2329. end sub
  2330.  
  2331. '
  2332. ' StartUp script for cloning forms
  2333. '
  2334. sub FormStartUp
  2335.  
  2336.     '
  2337.     ' Start creating the form cloning script
  2338.     '
  2339.     CopyrightScript
  2340.     FormAbstractScript
  2341.  
  2342.     '
  2343.     ' The script program starts
  2344.     '
  2345.     blank
  2346.     ws("option explicit")
  2347.     blank
  2348.  
  2349.     ws("'")
  2350.     ws("' Verbose Level")
  2351.     ws("'")
  2352.     ws("const kNormal    = 0")
  2353.     ws("const kVerbose   = 1")
  2354.     blank
  2355.  
  2356.     ws("'")
  2357.     ws("' Flag, set if users don't want to replace the old forms")
  2358.     ws("'")
  2359.     ws("dim bKeepOriginalOnes")
  2360.     blank
  2361.  
  2362.     ws("dim strDestServer")
  2363.     blank
  2364.  
  2365.     ws("' The number of forms to be installed")
  2366.     blank
  2367.     ws("dim iFormCount")
  2368.     blank
  2369.     ws("' The number of forms sucessfully installed")
  2370.     blank
  2371.     ws("dim iSuccessCount")
  2372.     blank
  2373.     ws("dim bVerbose")
  2374.     blank
  2375.  
  2376.     ws("main")
  2377.     blank
  2378.     ws("'")
  2379.     ws("' Main execution starts here")
  2380.     ws("'")
  2381.  
  2382.     ws("sub main")
  2383.     blank
  2384.     ws("    bVerbose = false")
  2385.     ws("    bKeepOriginalOnes = false")
  2386.     ws("    iFormCount  = 0")
  2387.     ws("    iSuccessCount = 0")
  2388.     ws("    strDestServer = """"")
  2389.     ws("    ParseCommandLine")
  2390.     blank
  2391.  
  2392. end sub
  2393.  
  2394. '
  2395. ' CleanUp script for cloning forms
  2396. '
  2397. sub FormCleanUp
  2398.  
  2399.     ws("end sub")
  2400.  
  2401.     '
  2402.     ' Append the subroutine "AddForm"
  2403.     '
  2404.     ScriptAddForm
  2405.  
  2406.     '
  2407.     ' Append the subroutine "DeleteForm"
  2408.     '
  2409.     ScriptDeleteForm
  2410.  
  2411.     '
  2412.     ' Append the commandline parsing script
  2413.     '
  2414.     ParseCommandLineScript
  2415.  
  2416.     '
  2417.     ' Append the Usage script
  2418.     '
  2419.     FormUsageScript
  2420.  
  2421.     '
  2422.     ' Append the output macro
  2423.     '
  2424.     EchoLineScript
  2425.  
  2426. end sub
  2427.  
  2428. '
  2429. ' Abstract for the form cloning script
  2430. '
  2431. sub FormAbstractScript
  2432.  
  2433.     ws("' Abstract:")
  2434.     ws("'")
  2435.     ws("' " & strScriptName & " - Form cloning script for Windows 2000")
  2436.     ws("'")
  2437.     oScript.WriteLine(kLongLineStr)
  2438.  
  2439. end sub
  2440.  
  2441. '
  2442. ' The Usage script used in the form cloning script
  2443. '
  2444. sub FormUsageScript
  2445.  
  2446.     blank
  2447.     ws("'")
  2448.     ws("' Display command usage.")
  2449.     ws("'")
  2450.     ws("sub Usage(ByVal bExit)")
  2451.     blank
  2452.  
  2453.     ws("    EchoLine kNormal, ""Usage: " & strScriptName & " [-c Destination_Server] [-kv]"" ")
  2454.     ws("    EchoLine kNormal, ""Arguments:"" ")
  2455.     ws("    EchoLine kNormal, ""    -c   - destination server name"" ")
  2456.     ws("    EchoLine kNormal, ""    -k   - keep the existing form that has the same name"" ")
  2457.     ws("    EchoLine kNormal, ""           (WARNING: If this flag is set, the cloned server may not be identical to the original one."" ")
  2458.     ws("    EchoLine kNormal, ""    -v   - verbose mode"" ")
  2459.     ws("    EchoLine kNormal, ""    -?   - display command usage"" ")
  2460.     ws("    EchoLine kNormal, """" ")
  2461.     ws("    EchoLine kNormal, ""Examples:"" ")
  2462.     ws("    EchoLine kNormal, ""    " & strScriptName & """ ")
  2463.     blank
  2464.  
  2465.     ws("    if bExit then")
  2466.     ws("        wscript.quit(1)")
  2467.     ws("    end if")
  2468.     blank
  2469.  
  2470.     ws("end sub")
  2471.     blank
  2472.  
  2473. end sub
  2474.  
  2475.  
  2476. '------------------------------------------------------------------------
  2477. '      Common scripts for the new generated cloning script
  2478. '------------------------------------------------------------------------
  2479.  
  2480. '
  2481. ' Copyright header in the script
  2482. '
  2483. sub CopyrightScript()
  2484.  
  2485.     oScript.WriteLine(kLongLineStr)
  2486.     ws("'")
  2487.     ws("' Copyright (c) Microsoft Corporation 1999")
  2488.     ws("' All Rights Reserved")
  2489.     ws("'")
  2490.  
  2491. end sub
  2492.  
  2493. '
  2494. ' The command line parsing script used in the generated cloning script
  2495. '
  2496. sub ParseCommandLineScript()
  2497.  
  2498.     blank
  2499.     ws("'")
  2500.     ws("' Command line parsing")
  2501.     ws("'")
  2502.     blank
  2503.  
  2504.     ws("sub ParseCommandLine()")
  2505.     blank
  2506.  
  2507.     ws("    dim oArgs")
  2508.     ws("    dim i")
  2509.     blank
  2510.  
  2511.     ws("    set oArgs = wscript.Arguments")
  2512.     blank
  2513.  
  2514.     ws("    while i < oArgs.Count")
  2515.     blank
  2516.  
  2517.     ws("       select case oArgs(i)")
  2518.     blank
  2519.  
  2520.     ws("           case ""-c"" ")
  2521.     ws("              i = i + 1")
  2522.     ws("              strDestServer = oArgs(i)")
  2523.     blank
  2524.  
  2525.     ws("           case ""-k"" ")
  2526.     ws("              bKeepOriginalOnes = true")
  2527.     blank
  2528.  
  2529.     ws("           case ""-v"" ")
  2530.     ws("              bVerbose = true")
  2531.     blank
  2532.  
  2533.     ws("           case ""-?"" ")
  2534.     ws("              Usage(true)")
  2535.     ws("              exit sub")
  2536.     blank
  2537.  
  2538.     ws("           case else")
  2539.     ws("              Usage(true)")
  2540.     ws("              exit sub")
  2541.     blank
  2542.  
  2543.     ws("         end select")
  2544.     blank
  2545.  
  2546.     ws("       i = i + 1")
  2547.     blank
  2548.  
  2549.     ws("     wend")
  2550.     blank
  2551.  
  2552.     ws("end sub")
  2553.     blank
  2554.  
  2555. end sub
  2556.  
  2557. '
  2558. ' Script for converting a bool to a string
  2559. '
  2560. sub BoolStrScript
  2561.  
  2562.     ws("'")
  2563.     ws("' Transform a bool value to a string")
  2564.     ws("'")
  2565.     ws("function BoolStr(ByVal bValue)")
  2566.     blank
  2567.     ws("  if bValue then")
  2568.     blank
  2569.     ws("      BoolStr = " & kTrueStr)
  2570.     blank
  2571.     ws("  else")
  2572.     blank
  2573.     ws("      BoolStr = " & kFalseStr)
  2574.     blank
  2575.     ws("  end if ")
  2576.     blank
  2577.     ws("end function")
  2578.     blank
  2579.  
  2580. end sub
  2581.  
  2582. '
  2583. ' Writing the script for debug output function
  2584. '
  2585. sub EchoLineScript
  2586.  
  2587.     ws("'")
  2588.     ws("' Print debug message according to the verbose level")
  2589.     ws("'")
  2590.     ws("sub EchoLine(ByVal Level, ByVal strALine)")
  2591.     blank
  2592.     ws("  if Level <> kVerbose or bVerbose = true then")
  2593.     blank
  2594.     ws("      wscript.echo strALine")
  2595.     blank
  2596.     ws("  end if ")
  2597.     blank
  2598.     ws("end sub")
  2599.     blank
  2600.  
  2601. end sub
  2602.  
  2603. '
  2604. ' The function returns the name of the local machine
  2605. '
  2606. function strGetLocalMachineName()
  2607.  
  2608.     dim WSHShell
  2609.     dim WSHSysEnv
  2610.  
  2611.     set WSHShell = WScript.CreateObject("Wscript.Shell")
  2612.     set WSHSysEnv = WSHShell.Environment("Process")
  2613.     strGetLocalMachineName = WSHSysEnv("COMPUTERNAME")
  2614.  
  2615. end function
  2616.  
  2617. '
  2618. ' Function to determine is a printer is local
  2619. '
  2620. function bIsLocal(ByVal strServerName, ByVal strPrinterName)
  2621.  
  2622.     on error resume next
  2623.  
  2624.     dim bRet
  2625.  
  2626.     dim oPrinter
  2627.     dim oMaster
  2628.  
  2629.     if strServerName <> "" then
  2630.  
  2631.         bIsLocal = true
  2632.  
  2633.         exit function
  2634.  
  2635.     end if
  2636.  
  2637.     set oMaster = CreateObject("PrintMaster.PrintMaster.1")
  2638.     set oPrinter = CreateObject("Printer.Printer.1")
  2639.  
  2640.     oMaster.PrinterGet strServerName, strPrinterName, oPrinter
  2641.  
  2642.     if Err = 0 then
  2643.  
  2644.         if  ( oPrinter.Attributes and kPrinterLocal)   = kPrinterLocal  and  _
  2645.             ( oPrinter.Attributes and kPrinterNetwork) = 0              then
  2646.  
  2647.            '
  2648.            ' It is a local printer
  2649.            '
  2650.            bRet = true
  2651.  
  2652.         else
  2653.  
  2654.            '
  2655.            ' It is not local
  2656.            '
  2657.            bRet = false
  2658.  
  2659.         end if
  2660.  
  2661.     else
  2662.  
  2663.         '
  2664.         ' Error getting printer configuration, then assume it is local and try installing it
  2665.         '
  2666.         wscript.echo "Error: Get printer configuration for printer """ & strPrinterName & """" _
  2667.                      & " on server """ & strServerName & """"
  2668.         wscript.echo "Error: 0x" & Hex(Err.Number)
  2669.         if Err.Description <> "" then
  2670.             wscript.echo "Error description: " & Err.Description
  2671.         end if
  2672.  
  2673.         Err.Clear
  2674.  
  2675.         bRet = true
  2676.  
  2677.     end if
  2678.  
  2679.     bIsLocal = bRet
  2680.  
  2681. end function
  2682.  
  2683. '
  2684. ' Function to remove the ServerName prefix in the printer name
  2685. '
  2686. function Strip(ByVal strOriginalPrinterName)
  2687.  
  2688.    dim strReturnPrinterName
  2689.    strReturnPrinterName=strOriginalPrinterName
  2690.  
  2691.    dim regEx
  2692.    set regEx = New RegExp
  2693.    regEx.Pattern =  "^\\\\[^\\]*\\"
  2694.    regEx.IgnoreCase = true
  2695.  
  2696.    '
  2697.    ' Remove the ServerName prefix by replacing  "\\*\" with ""
  2698.    '
  2699.    strReturnPrinterName=regEx.Replace(strReturnPrinterName, "")
  2700.  
  2701.    Strip=strReturnPrinterName
  2702.  
  2703. end function
  2704.  
  2705. '
  2706. ' Function to remove the "\\" in front of the ServerName
  2707. '
  2708. function strGetNameStringOnly(ByVal strPrefixServerName)
  2709.  
  2710.    dim strReturn
  2711.    strReturn=strPrefixServerName
  2712.  
  2713.    dim regEx
  2714.    set regEx = New RegExp
  2715.    regEx.Pattern =  "^\\\\"
  2716.    regEx.IgnoreCase = true
  2717.  
  2718.    '
  2719.    ' Remove of "\\"
  2720.    '
  2721.    strReturn=regEx.Replace(strReturn, "")
  2722.  
  2723.    strGetNameStringOnly=strReturn
  2724.  
  2725. end function
  2726.  
  2727. '
  2728. ' Function to change single " in the string to be double "s
  2729. '
  2730. function StuffQuote(ByVal strInput)
  2731.  
  2732.   Dim iIndex
  2733.   Dim strOutput
  2734.   strOutput = ""
  2735.  
  2736.   for iIndex = 1 to len(strInput)
  2737.  
  2738.     if mid(strInput, iIndex, 1) <> """" then
  2739.  
  2740.         ' This char is not a "
  2741.  
  2742.         strOutput = strOutput & mid(strInput, iIndex, 1)
  2743.  
  2744.     else
  2745.  
  2746.         ' It is a ", change it to be two "s
  2747.  
  2748.         strOutput = strOutput & """"""
  2749.  
  2750.     end if
  2751.  
  2752.   next
  2753.  
  2754.   StuffQuote = strOutput
  2755.  
  2756. end function
  2757.  
  2758.  
  2759. '------------------------------------------------------------------------
  2760. '      Helper functions for this program itself
  2761. '------------------------------------------------------------------------
  2762.  
  2763. '
  2764. ' Transform a bool value to a string
  2765. '
  2766. function BoolStr(ByVal bValue)
  2767.  
  2768.   if bValue then
  2769.  
  2770.     BoolStr = kTrueStr
  2771.  
  2772.   else
  2773.  
  2774.     BoolStr = kFalseStr
  2775.  
  2776.   end if
  2777.  
  2778. end function
  2779.  
  2780. '
  2781. ' Parse the command line into it's components
  2782. '
  2783. sub ParseCommandLine()
  2784.  
  2785.     dim oArgs
  2786.     dim i
  2787.  
  2788.     iAction = kActionUnknown
  2789.  
  2790.     set oArgs = wscript.Arguments
  2791.  
  2792.     if oArgs.Count = 0 then
  2793.         Usage(true)
  2794.         exit sub
  2795.     end if
  2796.  
  2797.     while i < oArgs.Count
  2798.  
  2799.         select case oArgs(i)
  2800.  
  2801.             case "-d"
  2802.                 iAction = kActionDrivers
  2803.  
  2804.             case "-o"
  2805.                 iAction = kActionPorts
  2806.  
  2807.             case "-p"
  2808.                 iAction = kActionPrinters
  2809.  
  2810.             case "-f"
  2811.                 iAction = kActionForms
  2812.  
  2813.             case "-a"
  2814.                 iAction = kActionAll
  2815.  
  2816.             case "-c"
  2817.                 i = i + 1
  2818.                 strServerName = oArgs(i)
  2819.  
  2820.             case "-?"
  2821.                 Usage(true)
  2822.                 exit sub
  2823.  
  2824.             case else
  2825.                 Usage(true)
  2826.                 exit sub
  2827.  
  2828.         end select
  2829.  
  2830.         i = i + 1
  2831.  
  2832.     wend
  2833.  
  2834. end sub
  2835.  
  2836. '
  2837. ' Display command usage.
  2838. '
  2839. sub Usage(ByVal bExit)
  2840.  
  2841.     wscript.echo "Usage: clone [-dopfa?] [-c server-name]"
  2842.     wscript.echo "Arguments:"
  2843.     wscript.echo "-d     - generate script for cloning the drivers"
  2844.     wscript.echo "-o     - generate script for cloning the ports"
  2845.     wscript.echo "-p     - generate script for cloning the printers"
  2846.     wscript.echo "-f     - generate script for cloning the forms"
  2847.     wscript.echo "-a     - generate script for cloning the drivers, ports, printers and forms"
  2848.     wscript.echo "-c     - source server name, default for local machine"
  2849.     wscript.echo "-?     - display command usage"
  2850.     wscript.echo ""
  2851.     wscript.echo "Examples:"
  2852.     wscript.echo "clone -d"
  2853.     wscript.echo "clone -o -c \\server"
  2854.     wscript.echo "clone -p -c \\server"
  2855.     wscript.echo "clone -f"
  2856.     wscript.echo "clone -a"
  2857.  
  2858.     if bExit then
  2859.         wscript.quit(1)
  2860.     end if
  2861.  
  2862. end sub
  2863.  
  2864. '
  2865. ' Function determining if the port name matches the pattern
  2866. '
  2867. function bFindPortPattern(strPattern, strString)
  2868.  
  2869.     dim RegEx
  2870.     set RegEx = New RegExp
  2871.     RegEx.Pattern = strPattern
  2872.     RegEx.IgnoreCase = true
  2873.     bFindPortPattern = RegEx.Test(strString)
  2874.  
  2875. end function
  2876.  
  2877. '
  2878. ' Macro for writing a line in the script
  2879. '
  2880. sub ws(ByVal strALine)
  2881.  
  2882.    oScript.WriteLine(strALine)
  2883.  
  2884. end sub
  2885.  
  2886. sub blank()
  2887.  
  2888.    ws("")
  2889.  
  2890. end sub
  2891.  
  2892. '-------  End of Cloning scripts
  2893.  
  2894. '
  2895. '------------------------------------------------------------------------
  2896. '      Shell Installing script  (use for launching the cloning scripts)
  2897. '------------------------------------------------------------------------
  2898. '
  2899.  
  2900. sub InstallScript(ByVal strScriptName, ByVal strPrefixServerName)
  2901.  
  2902.     wscript.echo
  2903.     wscript.echo "Creating the installing script..."
  2904.  
  2905.     '
  2906.     ' Open the script file
  2907.     '
  2908.     set oScript = oFileSystem.CreateTextFile(strScriptName,TRUE)
  2909.  
  2910.     '
  2911.     ' Start creating the shell script
  2912.     '
  2913.     ws("@rem Abstract:")
  2914.     ws("@rem")
  2915.     ws("@rem " & strScriptName & " - shell script for installing all the server components")
  2916.     ws("@rem")
  2917.     blank
  2918.  
  2919.     ws("@echo off")
  2920.     blank
  2921.  
  2922.     ws("if ""%1"" == ""-?"" goto Usage")
  2923.     ws("if ""%1"" == ""/?"" goto Usage")
  2924.     blank
  2925.  
  2926.     dim strParameters
  2927.     strParameters = " %1 %2 %3 %4 "
  2928.  
  2929.     ws("cscript " & strPrefixServerName & kDriverScript   & strParameters)
  2930.     ws("cscript " & strPrefixServerName & kPortScript     & strParameters)
  2931.     ws("cscript " & strPrefixServerName & kPrinterScript  & strParameters)
  2932.     ws("cscript " & strPrefixServerName & kFormScript     & strParameters)
  2933.     blank
  2934.  
  2935.     ws("goto End")
  2936.     blank
  2937.  
  2938.     ws(":Usage")
  2939.     blank
  2940.  
  2941.     InstallUsageScript
  2942.  
  2943.     ws(":End")
  2944.  
  2945.     '
  2946.     ' Close the script file
  2947.     '
  2948.     oScript.Close
  2949.  
  2950.     wscript.echo "The script file for installing all server components is """ & strScriptName & """."
  2951.  
  2952. end sub
  2953.  
  2954. '
  2955. ' The Usage script used in the install script
  2956. '
  2957. sub InstallUsageScript
  2958.  
  2959.     ws("    echo Usage: " & strScriptName & " [-kv?] [-c server-name]")
  2960.     ws("    echo Arguments: ")
  2961.     ws("    echo -k     - keep the existing component with the same name")
  2962.     ws("    echo -v     - verbose mode")
  2963.     ws("    echo -c     - destination server name")
  2964.     ws("    echo -?     - display command usage")
  2965.     ws("    echo.")
  2966.     ws("    echo Examples: ")
  2967.     ws("    echo    " & strScriptName )
  2968.     ws("    echo    " & strScriptName & " -v ")
  2969.     ws("    echo    " & strScriptName & " -c \\server ")
  2970.     ws("    echo    " & strScriptName & " -v -c \\server ")
  2971.     ws("    echo    " & strScriptName & " -k -v -c \\server ")
  2972.     ws("    echo    " & strScriptName & " -? ")
  2973.     blank
  2974.  
  2975. end sub
  2976.  
  2977. '
  2978. ' Determines which program is used to run this script.
  2979. ' Returns true if the script host is cscript.exe
  2980. '
  2981. function IsHostCscript()
  2982.  
  2983.     on error resume next
  2984.  
  2985.     dim strFullName
  2986.     dim strCommand
  2987.     dim i, j
  2988.     dim bReturn
  2989.  
  2990.     bReturn = false
  2991.  
  2992.     strFullName = WScript.FullName
  2993.  
  2994.     i = InStr(1, strFullName, ".exe", 1)
  2995.  
  2996.     if i <> 0 then
  2997.  
  2998.         j = InStrRev(strFullName, "\", i, 1)
  2999.  
  3000.         if j <> 0 then
  3001.  
  3002.             strCommand = Mid(strFullName, j+1, i-j-1)
  3003.  
  3004.             if LCase(strCommand) = "cscript" then
  3005.  
  3006.                 bReturn = true
  3007.  
  3008.             end if
  3009.  
  3010.         end if
  3011.  
  3012.     end if
  3013.  
  3014.     if Err <> 0 then
  3015.  
  3016.         call wscript.echo("Error 0x" & hex(Err.Number) & " occurred. " & Err.Description _
  3017.                           & ". " & vbCRLF & "The scripting host could not be determined.")
  3018.  
  3019.     end if
  3020.  
  3021.     IsHostCscript = bReturn
  3022.  
  3023. end function
  3024.  
  3025. '
  3026. ' Converts a driver environment string to a string
  3027. ' representing the architecture of the driver.
  3028. '
  3029. function GetArchitecture(strEnvironment)
  3030.  
  3031.     dim strArchitecture
  3032.  
  3033.     if strEnvironment = kEnvironmentIntel then
  3034.         strArchitecture = kArchIntel
  3035.     elseif strEnvironment = kEnvironmentMIPS then
  3036.         strArchitecture = kArchMIPS
  3037.     elseif strEnvironment = kEnvironmentAlpha then
  3038.         strArchitecture = kArchAlpha
  3039.     elseif strEnvironment = kEnvironmentPowerPC then
  3040.         strArchitecture = kArchPowerPC
  3041.     elseif strEnvironment = kEnvironmentWindows then
  3042.         strArchitecture = kArchIntel
  3043.     else
  3044.         strArchitecture = kArchUnknown
  3045.     end if
  3046.  
  3047.     GetArchitecture = strArchitecture
  3048.  
  3049. end function
  3050.  
  3051. '
  3052. ' Converts a driver environment string and a number to
  3053. ' a string representing the driver version
  3054. '
  3055. function GetVersion(uVersion, strEnvironment)
  3056.  
  3057.     dim strVersion
  3058.  
  3059.     select case uVersion
  3060.     case 0:
  3061.         if strEnvironment = kEnvironmentWindows then
  3062.             strVersion = kVersionWindows95
  3063.         else
  3064.             strVersion = kVersionNT31
  3065.  
  3066.         end if
  3067.  
  3068.     case 1:
  3069.         if strEnvironment = kEnvironmentPowerPC then
  3070.             strVersion = kVersion351
  3071.         else
  3072.             strVersion = kVersion35x
  3073.         end if
  3074.  
  3075.     case 2:
  3076.         if strEnvironment = kEnvironmentPowerPC or _
  3077.            strEnvironment = kEnvironmentMIPS    or _
  3078.            strEnvironment = kEnvironmentAlpha   then
  3079.             strVersion = kVersion40
  3080.         else
  3081.             strVersion = kVersion4050
  3082.         end if
  3083.  
  3084.     case 3:
  3085.         strVersion = kVersion50
  3086.  
  3087.     case else:
  3088.         strVersion = kArchUnknown
  3089.  
  3090.     end select
  3091.  
  3092.     GetVersion = strVersion
  3093.  
  3094. end function
  3095.